我在单身人士中使用保留还是复制?
我读了一个地方,与一个对象的NSString,你必须使用副本,而不是保留。有人可以解释这是否正确,为什么?我在单身人士中使用保留还是复制?
例如我有以下声明为我的单身:
#import <foundation/Foundation.h>
@class FaxRecipient;
@interface MyManager : NSObject {
NSString *subject;
NSString *reference;
NSString *coverSheet;
FaxRecipient *faxRecipient;
}
@property (nonatomic, retain) NSString *test1;
@property (nonatomic, retain) NSString *test2;
@property (nonatomic, retain) NSString *test3;
@property (nonatomic,retain) FaxRecipient *faxRecipient;
+ (id)sharedManager;
@end
我觉得“必须”在的意义上必须有点强。您可以兼用copy
或retain
,但你应该一般使用copy
您NSString*
属性,因为:
- 你通常不希望有一个字符串属性你的鼻子底下发生变化;
-
NSMutableString
是NSString
的一个子类,因此有人可能会将NSString*
属性设置为指向可变字符串,从而在您使用字符串时可能会更改字符串。 - 对于像
NSString
这样的不可变类,复制操作最终只是保留原始对象。
考虑这三个点,这是很难想象的很好的理由使用retain
,而不是copy
您NSString
性能。
你也可以使用'assign'! ;) – justin 2011-05-31 06:38:44
你应该用在这种情况下,保留价值。原因是这样的 1.你不希望对象被释放 2.你很可能会想要改变NSString的值在某个点
使用copy属性基本上是说您的NSString的值不应在没有警告的情况下更改。即它将停止同时设置和检索NSString的值。
对于这个实现,你应该使用retain,或者至少这就是我的理解。欲了解更多请看:http://cocoawithlove.com/2010/06/assign-retain-copy-pitfalls-in-obj-c.html
您既可以使用,在这两种情况下你将对象的所有者和需要dealloc的被释放。
copy
与retain
之间的区别。
保留: - >它只是增加存在对象的保留计数。
副本: - >这箱子为你的财产
在这两种情况下,新的对象:你将有对象的所有权。
阅读Apple memory management concept。
@克劳斯石塔:从苹果文档
你把一个对象的所有权,如果你 使用其名称 开始“黄金”,“新”,“复制”的方法创建它,或 “mutableCopy”(例如,alloc, newObject或mutableCopy),或者如果您向其发送保留消息 。
@Jhaliya只是因为你保留一个对象并不意味着你成为所有者。正如@Caleb指出的那样,你无法保护不会有人向你发送一个NSMutableString,并在稍后改变它。 – 2011-05-31 07:05:32
@克劳斯布洛奇:那么告诉......我们为什么要使用保留? – Jhaliya 2011-05-31 07:13:35
@Jhaliya为了让我们自己参考一个对象,从而确保它不会在其他人放弃对它的兴趣时被释放掉 – 2011-05-31 07:39:46
你提到的代码是正确的。你必须使用保留。 – Satyam 2011-05-31 05:41:56
这是我的理解,以及使用保留。我对这里的其他理论和理由感兴趣。春天想到的一个原因是复制意味着如果你通过了一个NSMutableString而不是NSString,那么如果可变字符串被另一个类改变了,你的类就不会受到影响。 NSString会有所不同,因为它是固定的。 – drekka 2011-05-31 05:52:57
http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain – Jason 2011-05-31 05:57:08