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

NSString属性复制还是只读?
EN

Stack Overflow用户
提问于 2011-11-03 03:39:57
回答 2查看 3.3K关注 0票数 6

我看到很多讨论说我应该使用复制来处理NSString属性,因为它会阻止其他人在我背后修改它。但是为什么我们不为它设置只读属性呢?

更新

谢谢你回答我的问题。但问题是,对于NSString属性,您总是不希望其他人修改它,对吗?你可以自己修改,但绝对不是其他人。我想大多数情况下,NSString会设置它的初始值(不管是由您还是由其他人设置),之后只有您才会修改它。那么为什么不使用只读属性呢?

其实我大部分时间都是用拷贝的。但是我意识到大多数时候我只在我的init方法中使用那些设置器。所以我想我应该用只读而不是拷贝来处理那些情况。

因此,让我以这样的方式提出问题:如果您只在init方法中为您的NSStrings使用这些设置器,那么您应该使用readonly。这是否合理的结论?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-03 04:09:17

如果您只在init方法中为您的NSStrings使用这些设置器,那么您应该使用readonly。这是否合理的结论?

由于不应该在部分构造的状态(init/dealloc)中使用访问器,所以应该将其声明为copyreadonly,然后在初始化程序中执行副本:

代码语言:javascript
复制
- (id)initWithName:(NSString *)inName
{
  self = [super init];
  if (0 != self) {
    name = [inName copy];
  }
  return self;
}

更详细地说,copyreadonly是语义上不同的概念。

  • 您使用copy,因为在大多数情况下您对这个值感兴趣。使用不可变字符串也是一种保障和优化。
  • 您使用readonly来禁止客户端更改/设置数据。

它们一起提供了很好的安全,但只有:

  • copy仍然允许客户端通过setter.
  • readonly在程序执行的任何时候设置值,这并不意味着copy,保留的属性可以在后台进行更改;考虑一下当您被传递给一个可变变量,并且客户端在调用setter.

之后对其进行变异时会发生什么。

最安全的方法是使用copyreadonly

显然,当您需要为客户端提供一个setter时,您将使用change.

  • retaining,并且您支持该字符串(或数组,或.)而不是抄袭通常是个坏主意。对于您来说,不复制这些类型很少有好的用处,而且它会导致微妙的错误。即使在处理可变类型时,通常也需要一个可变副本(编译器不会为您合成该副本)。保留或分配这些类型几乎从来都不是你想要的。我的一个例外是在处理大型分配时,数据封装得很好(例如,我将所有权从一个地方传递到另一个地方以避免复制)。
票数 12
EN

Stack Overflow用户

发布于 2011-11-03 03:42:40

如果您不希望其他人修改您的属性,那么您绝对应该将其标记为readonly。当人们说使用copy意味着不能在背后更改字符串时,如果有人将字符串分配给您的属性,并且字符串是可变的,那么他们就会对字符串进行变异,当您稍后访问属性时,您将得到更改后的字符串。但是,如果使用copy,您将得到字符串在分配给属性时(人们期望发生的情况)的快照。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7990016

复制
相关文章

相似问题

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