【发布时间】:2012-08-16 17:49:05
【问题描述】:
我启动了一个小型 Xcode 项目来调查 NSMutableString 属性应该是 copy 还是 retain。我用copy 属性声明了我的属性:
@property (nonatomic,copy) NSMutableString *stringA;
然后将其初始化为self.stringA = [NSMutableString new];
终于尝试设置一个字符串[stringA setString:@"A"];。
无论程序给出什么,
“由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'尝试使用setString改变不可变对象:'”
是不是因为结果字符串是NSString?这是否意味着我应该使用retain 属性和NSString 属性使用copy 声明我的NSMutableString 属性?
【问题讨论】:
-
一开始你几乎肯定不希望可变字符串作为属性;至少,不是作为 API 公开的。
-
我的回答,用太多的话来说:stackoverflow.com/questions/4995254/…
-
对 NSStrings 使用
copy是没有意义的。 -
@HotLicks 不,不是。记住语义!如果客户端将可变字符串作为参数传递给您的类,您保留它,然后他们在您背后改变它,会发生什么?坏事。简单的解决方案是制作一个副本——如果参数是可变的,那么您就有了正确性,并且您可以轻松传递一个字符串,而无需创建更多副本。如果它是不可变的,那么它可以
return [self retain]而无需进行深层复制。 -
到目前为止我的理解是复制在 NSString 中很重要,但在 NSMutableString 中不重要。由于 NSMutableString 是 NSString 的子类,因此您可以将 NSMutableString 分配给 NSString。如果我在这里错了,请纠正我。
标签: objective-c cocoa nsmutablestring declared-property