NSString属性:复制还是保留?

NSString属性:复制还是保留?

假设我有一个叫SomeClass带着string财产名称:

@interface SomeClass : NSObject{
    NSString* name;}@property (nonatomic, retain) NSString* name;@end

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

  • 对于一般的字符串,是吗?

    使用

    copy

    属性而不是

    retain?

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


守着星空守着你
浏览 379回答 3
3回答

ABOUTYOU

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

扬帆大鱼

对于一般的字符串来说,使用Copy属性而不是RELARE总是一个好主意吗?是的-通常总是使用Copy属性。这是因为你NSString性质可以传递一个NSString实例或者NSMutableString实例因此,我们无法真正确定传递的值是不可变的还是可变的。“复制”财产是否以任何方式比“保留”财产效率低?如果您的属性正在被传递,则NSString实例,答案是“不“-复制的效率不亚于保留。(它的效率并不低,因为NSString足够聪明,可以不实际执行副本。)如果您的属性被传递给NSMutableString实例那么答案是“是“-复制不如保留有效。(效率较低,因为必须进行实际的内存分配和复制,但这可能是一件可取的事情。)一般来说,“复制”属性可能会降低效率-但是通过使用NSCopying协议,它可以实现一个类,它是“同样有效的”复制和它是保留。NSString实例就是一个例子。一般情况下(不只是NSString),什么时候我应该使用“拷贝”而不是“保留”?你应该一直用copy当您不想在没有警告的情况下更改属性的内部状态时。即使对于不可变对象-正确编写的不可变对象也将有效地处理副本(请参阅下一节关于不可变性和NSCopying).可能有性能原因retain对象,但它带有维护开销-您必须管理内部状态在代码之外更改的可能性。就像他们说的-最后优化。但是,我写我的课是不变的-我就不能“保留”它吗?不使用copy..如果您的类确实是不可变的,那么实现NSCopying协议,使您的类在copy被利用了。如果你这样做:类的其他用户在使用copy.这个copy注释使您自己的代码更易于维护-copy注释表明,您实际上不需要担心此对象在其他地方更改状态。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS