NSString 与 NSMutableString 的 property 约束

之前在网上看了很多关于 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。

你可能感兴趣的:(NSString 与 NSMutableString 的 property 约束)