之前在网上看了很多关于 NSString 的 property 约束,不过总感觉总结得没那么直接。这里我再重复的总结一下。
对于 NSString 来说,到底用 copy 还是 strong?
看看下面的代码:
@interface Test: NSObject
@property (nonatomic, strong) NSString * string;
@end
// Some Code here …………
NSMutableString * aStr = [@"hello" mutableCopy];
Test * test = [Test new];
test.string = aStr;
[aStr appendString:@" world"];
NSLog(@"%@", test.string);
以上代码,原本打算 test 对象的 string 对象赋值之后就不会改变,即一直都是 hello,然而上面的代码输出是 hello world,违背了代码设计的初衷。
NSString 如果使用 strong 的话, 从外部给这个属性赋值,可能是一个 NSMutableString,如果外部把这个 NSMutableString 的值给改变了, 那么这个属性的值也会被改变。
对于NSMutableString来说,用 copy 还是 strong?
@interface Test: NSObject
@property (nonatomic, copy) NSMutableString * mString;
@end
// Some Code here …………
NSMutableString * aStr = [@"hello" mutableCopy];
Test * test = [Test new];
test.mString = aStr;
[test.mString appendString:@"world"];
以上代码中,test 对象的 mString 属性,由于定义的 copy,然而copy属性会拷贝一个不可变的值
,然而我们对它进行一些可变协议的操作,即执行:[NSString appendString:],程序崩溃。
NSMutableString 如果使用 copy 的话,将一个外部对象赋值给这个属性的时候, 会进行一次 copy 操作, 然而 copy 是拷贝出一个不可变的对象给属性(实际上应该调用 mutableCopy,但是@property 并没有 mutableCopy),如果之后对这个属性(实际上是一个不可变的对象)进行可变协议的调用, 那么程序就会崩溃。
总结
和 NSString 与 NSMutableString 类似,NSArray 与 NSMutableArray, NSDictionary 与 NSMutableDictiontary也与以上运行效果一致。
- NSString, NSArray 与 NSDictionary 使用 copy;
- NSMutableString, NSMutableArray 与 NSMutableDictionary使用 strong。