NSString属性是复制还是只读?

Qiu*_*ang 6 memory-management properties objective-c nsstring

我看到很多讨论说我应该使用copy for NSString属性,因为它会阻止其他人在我背后更改它.但那么为什么我们不为它设置只读属性呢?

更新

谢谢回答我的问题.但问题是,对于NSString属性,你总是不希望别人修改它,对吧?您可以自己修改它,但绝对不能修改其他人.我猜大多数时候NSString都会设置它的初始值(由你或其他人设置),之后只有你会修改它.那么为什么不只是使用readonly属性

其实我大部分时间都使用复制品.但后来我发现大部分时间我只在init方法中使用那些setter.所以我认为我应该使用readonly而不是copy来处理这些情况.

因此,让我以这种方式提出问题:如果您只在init方法中使用这些setter作为NSStrings,那么您应该使用readonly.这是一个合理的结论吗?

jus*_*tin 12

如果您只在init方法中为NSStrings使用这些setter,那么您应该使用readonly.这是一个合理的结论吗?

既然你不应该使用在部分构造的状态存取(init/ dealloc),那么你应该将它声明为copyreadonly,然后执行初始化副本:

- (id)initWithName:(NSString *)inName
{
  self = [super init];
  if (0 != self) {
    name = [inName copy];
  }
  return self;
}
Run Code Online (Sandbox Code Playgroud)

更详细地说,copy并且readonly是语义上不同的概念.

  • 你使用copy是因为你对大多数情况下的价值感兴趣.它也是使用不可变字符串的安全措施和优化.

  • readonly用来禁止客户端改变/设置您的数据.

它们共同提供了良好的安全性,但仅此一项:

  • copy 仍然允许客户端通过setter在程序执行的任何点设置值.

  • readonly并不意味着copy,保留财产可以在你背后改变; 考虑当你传递一个可变变量时会发生什么,并且客户端在调用setter之后会改变它.

最安全的方法是使用copyreadonly.

  • 很明显,readwrite当您需要为客户提供setter时,您将使用,并支持该更改.

  • 保留一个字符串(或数组,或......)而不是复制通常是一个坏主意.很难有一个很好的用途,你不要复制这些类型,它可能会导致微妙的错误.即使你正在处理一个可变类型,你通常也会想要一个可变副本(编译器不会为你合成).保留或分配这些类型几乎不是你想要的.我做的一个例外是在处理大量分配时,数据被很好地封装(例如NSMutableData,我将所有权从一个地方传递到另一个地方以避免复制的重型实例).


Lil*_*ard 6

如果您不希望其他人修改您的财产,那么您绝对应该标记它readonly.当人们说使用copy意味着字符串无法在你的背后改变时,人们的意思是,如果有人为你的属性分配一个字符串,并且字符串是可变的,然后他们改变字符串,当你以后访问你的属性时,你'我会找回更改后的字符串.但是如果你使用copy那么你会得到一个关于字符串如何分配给属性的时间的快照(这是人们期望发生的事情).