非原创、Gemini 问答生成
简介
copy
和 mutableCopy
都是 Objective-C 和 Swift 中用于创建对象副本的方法。但是,它们在创建的副本类型和生成的对象的可变性方面有所不同。
Objective-C
在 Objective-C 中,copy
和 mutableCopy
都返回一个 id 对象,该对象可以转换为适当的类类型。
copy
: 创建对象的不可变副本。复制对象的內容与原始对象相同,但复制对象的内存地址不同。这意味着对副本的更改不会影响原始对象,反之亦然。mutableCopy
: 创建对象的可变副本。复制对象的內容与原始对象相同,并且具有相同的内存地址。这意味着对副本的更改也会影响原始对象。
以下是如何在 Objective-C 中使用 copy
和 mutableCopy
的示例:
Objective-C
NSString *originalString = @"Hello, world!";
NSString *immutableCopy = [originalString copy];
NSLog(@"Immutable copy: %@", immutableCopy); // 输出:Immutable copy: Hello, world!
NSMutableString *mutableCopy = [originalString mutableCopy];
[mutableCopy appendString:@"!"];
NSLog(@"Original string: %@", originalString); // 输出:Original string: Hello, world!
NSLog(@"Mutable copy: %@", mutableCopy); // 输出:Mutable copy: Hello, world!
Swift
在 Swift 中,copy
和 mutableCopy
返回对象的相应值类型。
copy
: 创建对象的不可变副本。复制对象的內容与原始对象相同,但复制对象的内存地址不同。这意味着对副本的更改不会影响原始对象,反之亦然。mutableCopy
: 创建对象的可变副本。复制对象的內容与原始对象相同,并且具有相同的内存地址。这意味着对副本的更改也会影响原始对象。
以下是如何在 Swift 中使用 copy
和 mutableCopy
的示例:
Swift
let originalString = "Hello, world!"
let immutableCopy = originalString.copy()
print(immutableCopy) // 输出:Hello, world!
var mutableCopy = originalString.mutableCopy() as! NSMutableString
mutableCopy.append("!")
print(originalString) // 输出:Hello, world!
print(mutableCopy) // 输出:Hello, world!
总结
copy
和 mutableCopy
之间的主要区别在于生成的对象的可变性。copy
创建不可变副本,而 mutableCopy
创建可变副本。这意味着对可变副本的更改也会影响原始对象,而对不可变副本的更改不会。
此外,copy
和 mutableCopy
也可用于创建存储在集合(例如数组和字典)中的对象的副本。这对于确保在迭代集合时不会修改集合的内容非常有用。
以下是一张表,总结了 copy
和 mutableCopy
之间的关键区别:
特性 | copy | mutableCopy |
---|---|---|
对象类型 | 不可变 | 可变 |
内存地址 | 不同 | 相同 |
对原始对象的影响 | 无 | 是 |
希望这对您有所帮助!