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
),那么你应该将它声明为copy
和readonly
,然后执行初始化副本:
- (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之后会改变它.
最安全的方法是使用copy
和readonly
.
很明显,readwrite
当您需要为客户提供setter时,您将使用,并支持该更改.
保留一个字符串(或数组,或......)而不是复制通常是一个坏主意.很难有一个很好的用途,你不要复制这些类型,它可能会导致微妙的错误.即使你正在处理一个可变类型,你通常也会想要一个可变副本(编译器不会为你合成).保留或分配这些类型几乎不是你想要的.我做的一个例外是在处理大量分配时,数据被很好地封装(例如NSMutableData
,我将所有权从一个地方传递到另一个地方以避免复制的重型实例).
如果您不希望其他人修改您的财产,那么您绝对应该标记它readonly
.当人们说使用copy
意味着字符串无法在你的背后改变时,人们的意思是,如果有人为你的属性分配一个字符串,并且字符串是可变的,然后他们改变字符串,当你以后访问你的属性时,你'我会找回更改后的字符串.但是如果你使用copy
那么你会得到一个关于字符串如何分配给属性的时间的快照(这是人们期望发生的事情).
归档时间: |
|
查看次数: |
3047 次 |
最近记录: |