2011-06-22 41 views
7

所以,只是一个简单的问题,何时应该使用副本而不是使用保留。我试图从互联网上看,但没有完全明白。那么有人可以照亮我吗?客观C复制并保留

+0

[NSString property:copy or retain?](http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain)或[Objective C Assign Copy Copy Retain](http:/ /stackoverflow.com/questions/4510913/)或[保留自动释放对象的副本](http://stackoverflow.com/questions/6416963/)或[何时使用保留和何时使用副本](http:// stackoverflow .com/questions/4087208 /)或[@property:Retain or copy?](http://stackoverflow.com/questions/5616170/)或[许多其他](http://stackoverflow.com/search?q= %5Bobjc%5D + copy + retain) –

+0

在这个问题的辩护中,其他人都是特定于财产类型,但是,这个问题已经被问了很多。 –

回答

27

当你想保证对象的状态时,你会使用copy

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"]; 
NSString *b = [mutString retain]; 
[mutString appendString:@"Test"]; 

在这一点上,b被第三条线弄乱了。

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"]; 
NSString *b = [mutString copy]; 
[mutString appendString:@"Test"]; 

在这种情况下,b是原始字符串,并且不会被第3行修改。

这适用于所有可变类型。

+4

值得注意的是,许多不可变类型将通过调用-retain来实现-copy;由于它们的价值永远不会改变,所以在内存中拥有两个副本是没有意义的。也就是说,如果没有进一步的信息,你应该总是编码,就好像你不知道一个特定的对象是否是可变的。仅仅因为你输入你的属性为NSString并不意味着有人不会将一个NSMutableString传递给它(如上图所示)。 – ipmcc

3

如果您不希望在不知道的情况下收到的值发生变化,则复制功能非常有用。例如,如果您有一个属性为NSString,并且您设置该字符串一旦设置就不会更改,则需要使用复制。否则,某人可以通过您NSMutableString并更改该值,从而更改NSString的基础值。 NSArrayNSMutableArray也是一样,除了数组上的副本只是将所有指针引用复制到新数组中,但会阻止删除和添加条目。

7

保留:它是在创建的对象上完成的,它只是增加引用计数。

复制 - 它创建一个新的对象,当创建新的对象时,保留计数将为1. 希望这可以帮助你。

+0

复制并不总是创建一个新对象 – newacct

+0

因此在保留我们增加引用计数到同一个对象上,而为了复制,我们增加了一个新对象的引用计数? – Honey