我看到很多讨论说我应该使用复制来处理NSString属性,因为它会阻止其他人在我背后修改它。但是为什么我们不为它设置只读属性呢?
更新
谢谢你回答我的问题。但问题是,对于NSString属性,您总是不希望其他人修改它,对吗?你可以自己修改,但绝对不是其他人。我想大多数情况下,NSString会设置它的初始值(不管是由您还是由其他人设置),之后只有您才会修改它。那么为什么不使用只读属性呢?
其实我大部分时间都是用拷贝的。但是我意识到大多数时候我只在我的init方法中使用那些设置器。所以我想我应该用只读而不是拷贝来处理那些情况。
因此,让我以这样的方式提出问题:如果您只在init方法中为您的NSStrings使用这些设置器,那么您应该使用readonly。这是否合理的结论?
发布于 2011-11-03 04:09:17
如果您只在init方法中为您的NSStrings使用这些设置器,那么您应该使用readonly。这是否合理的结论?
由于不应该在部分构造的状态(init/dealloc)中使用访问器,所以应该将其声明为copy和readonly,然后在初始化程序中执行副本:
- (id)initWithName:(NSString *)inName
{
self = [super init];
if (0 != self) {
name = [inName copy];
}
return self;
}更详细地说,copy和readonly是语义上不同的概念。
copy,因为在大多数情况下您对这个值感兴趣。使用不可变字符串也是一种保障和优化。readonly来禁止客户端更改/设置数据。它们一起提供了很好的安全,但只有:
copy仍然允许客户端通过setter.readonly在程序执行的任何时候设置值,这并不意味着copy,保留的属性可以在后台进行更改;考虑一下当您被传递给一个可变变量,并且客户端在调用setter.之后对其进行变异时会发生什么。
最安全的方法是使用copy和readonly。
显然,当您需要为客户端提供一个setter时,您将使用change.
发布于 2011-11-03 03:42:40
如果您不希望其他人修改您的属性,那么您绝对应该将其标记为readonly。当人们说使用copy意味着不能在背后更改字符串时,如果有人将字符串分配给您的属性,并且字符串是可变的,那么他们就会对字符串进行变异,当您稍后访问属性时,您将得到更改后的字符串。但是,如果使用copy,您将得到字符串在分配给属性时(人们期望发生的情况)的快照。
https://stackoverflow.com/questions/7990016
复制相似问题