为了账号安全,请及时绑定邮箱和手机立即绑定

NSString属性:复制还是保留?

NSString属性:复制还是保留?

iOS
守着星空守着你 2019-06-18 13:34:31
NSString属性:复制还是保留?假设我有一个叫SomeClass带着string财产名称:@interface SomeClass : NSObject{     NSString* name;}@property (nonatomic, retain) NSString* name;@end据我所知,这个名字可能被指定为NSMutableString在这种情况下,这可能导致错误的行为。对于一般的字符串,是吗?总使用copy属性而不是retain?“复制”财产是否以任何方式比“保留”财产效率低?
查看完整描述

3 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-06-18
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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

是的-通常总是使用Copy属性。

这是因为你NSString性质可以传递一个NSString实例或者NSMutableString实例因此,我们无法真正确定传递的值是不可变的还是可变的。

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

  • 如果您的属性正在被传递,则NSString实例,答案是““-复制的效率不亚于保留。
    (它的效率并不低,因为NSString足够聪明,可以不实际执行副本。)

  • 如果您的属性被传递给NSMutableString实例那么答案是““-复制不如保留有效。
    (效率较低,因为必须进行实际的内存分配和复制,但这可能是一件可取的事情。)

  • 一般来说,“复制”属性可能会降低效率-但是通过使用NSCopying协议,它可以实现一个类,它是“同样有效的”复制和它是保留。NSString实例就是一个例子。

一般情况下(不只是NSString),什么时候我应该使用“拷贝”而不是“保留”?

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

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

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

不使用copy..如果您的类确实是不可变的,那么实现NSCopying协议,使您的类在copy被利用了。如果你这样做:

  • 类的其他用户在使用

    copy.

  • 这个

    copy

    注释使您自己的代码更易于维护-

    copy

    注释表明,您实际上不需要担心此对象在其他地方更改状态。


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 378 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信