假设我有一个名为SomeClass的类,它有一个string属性名:
@interface SomeClass : NSObject
{
NSString* name;
}
@property (nonatomic, retain) NSString* name;
@end我知道名称可能被指定为NSMutableString,在这种情况下,这可能导致错误的行为。
copy属性而不是retain总是一个好主意吗?发布于 2008-12-23 02:23:36
对于类型为符合NSCopying协议的不可变值类的属性,几乎总是应该在@property声明中指定copy。在这种情况下,几乎不希望指定retain。
这就是为什么你想这么做
NSMutableString *someName = [NSMutableString stringWithString:@"Chris"];
Person *p = [[[Person alloc] init] autorelease];
p.name = someName;
[someName setString:@"Debajit"];Person.name属性的当前值将有所不同,取决于该属性是声明为retain还是copy --如果该属性被标记为retain,则为@"Debajit";如果该属性被标记为copy,则为@"Chris"。
因为在几乎所有的情况下,您都希望防止在对象背后更改对象的属性,所以应该标记表示它们的属性( copy )。(如果您自己编写setter而不是使用@synthesize,那么您应该记住在其中使用copy而不是retain。)
发布于 2008-12-23 02:11:39
复制应用于NSString。如果它是可变的,那么它就会被复制。如果不是,那它就会被保留下来。精确的语义,你想在一个应用(让类型做什么是最好的)。
发布于 2012-05-23 07:14:45
对于一般的字符串来说,使用copy属性而不是retain总是一个好主意吗?
是的-通常总是使用copy属性.
这是因为您的NSString属性可以传递NSString实例或NSMutableString实例,因此我们无法真正确定所传递的值是不可变的还是可变的。
“复制”财产是否以任何方式比“保留”财产效率低?
NSCopying协议,可以实现一个类,该类“复制”与保留一样有效。NSString实例就是这方面的一个例子。通常(不仅仅是对于NSString),什么时候我应该使用“复制”而不是“保留”?
当您不想在没有警告的情况下更改属性的内部状态时,应该始终使用copy。即使对于不可变对象--正确编写的不可变对象也将有效地处理副本(请参阅关于不可变性和NSCopying的下一节)。
retain对象可能有性能原因,但它会带来维护开销--您必须管理在代码之外更改内部状态的可能性。就像他们说的-最后优化。
但是,我写我的课是不变的-我就不能“保留”它吗?
不使用copy.如果您的类确实是不可变的,那么最好实现NSCopying协议,使类在使用copy时返回自己。如果你这样做:
copy时将获得性能好处。copy注释使您自己的代码更易于维护-- copy注释表明您真的不需要担心这个对象在其他地方改变状态。https://stackoverflow.com/questions/387959
复制相似问题