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。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,916评论 1 32
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 6,662评论 0 12
  • 出题者简介: 孙源(sunnyxx),目前就职于百度,负责百度知道 iOS 客户端的开发工作,对技术喜欢刨根问底和...
    戈多_于勒阅读 5,776评论 0 5
  • 天色已晚,躺在床上手扶微凸的小肚子。心里充满了喜悦,还有淡淡的忧愁。宝贝的到来给我和爸爸带来了无比的喜悦的同时也带...
    玛西子阅读 3,017评论 2 4
  • 胡秉言 情愿为你伤 伤情有何妨 昨日柳荫花树旁 两心齐飞翔 齐飞翔 戏水鸯 共建爱巢蜜饯尝 情愿为你伤 伤情有何妨...
    沂蒙居士阅读 4,223评论 15 14

友情链接更多精彩内容