首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSString属性:复制还是保留?

NSString属性:复制还是保留?
EN

Stack Overflow用户
提问于 2008-12-23 01:56:34
回答 10查看 137.5K关注 0票数 335

假设我有一个名为SomeClass的类,它有一个string属性名:

代码语言:javascript
复制
@interface SomeClass : NSObject
{
    NSString* name;
}

@property (nonatomic, retain) NSString* name;

@end

我知道名称可能被指定为NSMutableString,在这种情况下,这可能导致错误的行为。

  • 对于一般的字符串,使用copy属性而不是retain总是一个好主意吗?
  • “复制”财产是否以任何方式比“保留”财产效率低?
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2008-12-23 02:23:36

对于类型为符合NSCopying协议的不可变值类的属性,几乎总是应该在@property声明中指定copy。在这种情况下,几乎不希望指定retain

这就是为什么你想这么做

代码语言:javascript
复制
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。)

票数 442
EN

Stack Overflow用户

发布于 2008-12-23 02:11:39

复制应用于NSString。如果它是可变的,那么它就会被复制。如果不是,那它就会被保留下来。精确的语义,你想在一个应用(让类型做什么是最好的)。

票数 121
EN

Stack Overflow用户

发布于 2012-05-23 07:14:45

对于一般的字符串来说,使用copy属性而不是retain总是一个好主意吗?

是的-通常总是使用copy属性.

这是因为您的NSString属性可以传递NSString实例NSMutableString实例,因此我们无法真正确定所传递的值是不可变的还是可变的。

“复制”财产是否以任何方式比“保留”财产效率低?

  • 如果您的属性被传递给一个NSString实例,则答案是"No“--复制的效率不亚于retain。 (它的效率并不低,因为NSString足够聪明,不能真正执行副本。)
  • 如果您的属性被传递给一个NSMutableString实例,那么答案是“”--复制的效率低于retain。 (效率较低,因为必须进行实际的内存分配和复制,但这可能是一件可取的事情。)
  • 一般来说,“复制”属性可能会降低效率--但是,通过使用NSCopying协议,可以实现一个类,该类“复制”与保留一样有效。NSString实例就是这方面的一个例子。

通常(不仅仅是对于NSString),什么时候我应该使用“复制”而不是“保留”?

当您不想在没有警告的情况下更改属性的内部状态时,应该始终使用copy。即使对于不可变对象--正确编写的不可变对象也将有效地处理副本(请参阅关于不可变性和NSCopying的下一节)。

retain对象可能有性能原因,但它会带来维护开销--您必须管理在代码之外更改内部状态的可能性。就像他们说的-最后优化。

但是,我写我的课是不变的-我就不能“保留”它吗?

不使用copy.如果您的类确实是不可变的,那么最好实现NSCopying协议,使类在使用copy时返回自己。如果你这样做:

  • 您类的其他用户在使用copy时将获得性能好处。
  • copy注释使您自己的代码更易于维护-- copy注释表明您真的不需要担心这个对象在其他地方改变状态。
票数 68
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/387959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档