我读到某个地方,在对象中使用NSString,必须使用copy而不是retain。有人可以解释这是否正确以及为什么?
例如,我的单身人士有以下声明:
#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
答案 0 :(得分:8)
我认为必须意义上的“必须”有点强。您可以使用copy
或retain
,但 通常会copy
用于NSString*
属性,因为:
NSMutableString
是NSString
的子类,因此有人可能会将您的NSString*
属性设置为指向可变字符串,从而创建了更改字符串的可能性当你正在使用它时; NSString
这样的不可变类,复制操作最终只会保留原始对象。考虑到这三点,很难想出使用retain
而不是copy
来表示NSString
属性的充分理由。
答案 1 :(得分:4)
更喜欢copy
。你的班级是否是单身人士并不重要。
我为此写了一个相当冗长的解释,其中详细介绍了可变和不可变类型: NSMutableString as retain/copy
答案 2 :(得分:3)
您也可以使用copy而不是retain。我使用NSString的副本。关于这个主题有很好的讨论。这是一个stackoverflow帖子NSString Copy or Retain?
答案 3 :(得分:0)
您可以使用两种情况,您将成为对象的所有者,并且需要在 dealloc 中发布。
copy
和retain
之间的区别。
保留: - &gt;它只是增加了对象的保留计数。
复制 - &gt;它为您的财产创建新对象
在这两种情况下:您将拥有对象的所有权。
阅读Apple memory management concept。
@ Claus Broch:来自Apple文档
如果您拥有对象的所有权 使用名称为的方法创建它 以“alloc”,“new”,“copy”或者开头 “mutableCopy”(例如,alloc, newObject,或mutableCopy),或者如果你 发送保留信息。
答案 4 :(得分:-2)
您应该在此实例中使用retain值。原因是这样的 1.您不希望对象被释放 2.你很可能想要在某个时候改变NSString的值
使用copy属性基本上是说NSString的值不应该在没有警告的情况下改变。即它将停止同时设置和检索的NSString的值。
对于这个实现,你应该使用retain,或者至少我的理解。有关详情,请点击此处:http://cocoawithlove.com/2010/06/assign-retain-copy-pitfalls-in-obj-c.html