尝试使用复制的NSMutableString属性会导致异常

rus*_*ord 5 cocoa objective-c nsmutablestring declared-property

我开始了一个小型的Xcode项目来调查一个NSMutableString属性应该是copy或者retain.我用copy属性声明了我的属性:

@property (nonatomic,copy) NSMutableString *stringA;
Run Code Online (Sandbox Code Playgroud)

然后将其初始化为 self.stringA = [NSMutableString new];

终于试着设置一个字符串[stringA setString:@"A"];.

但是程序给出了,

"由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'尝试使用setString改变不可变对象:'"

是因为结果字符串是NSString?这是否意味着我应该NSMutableString使用retain属性和NSString属性声明我的属性copy

omz*_*omz 11

你是对的,返回的copy方法NSMutableString不可变的 NSString.这是可可的公约,它也适用于NSMutableArray,NSMutableDictionary等等.

因此,如果您希望您的财产保持可变性,则应将其声明为retain.如果你需要复制语义,但仍然希望结果是可变的,你必须为属性实现自己的setter(并用于mutableCopy进行复制).

您经常看到copy字符串属性的原因是,通常需要保证字符串是不可变的,无论为该属性分配何种类型的字符串.否则,您最终可能会意外地在其他地方修改相同的字符串,这可能很难调试.不可变对象还具有线程安全的好处.