关于Copy和Strong类型修饰符的思考

先看看以下两段代码。

第一段:修饰符为strong

@property (strong,nonatomic) NSMutableString *stringMutable;
- (void)testCopyAndStrong1
{
    NSMutableString *tempString = [NSMutableString string];
    self.stringMutable = tempString;
    [tempString appendString:@"111"];
    NSLog(@"%@--%@",self.stringMutable,tempString);
}

第二段:修饰符为copy

@property (copy,nonatomic) NSMutableString *stringMutable;
- (void)testCopyAndStrong2
{
    NSMutableString *tempString = [NSMutableString string];
    self.stringMutable = tempString;
    [tempString appendString:@"111"];
    NSLog(@"%@--%@",self.stringMutable,tempString);
    [self.stringMutable appendString:@"222"];
}

第一段打印:111--111
第二段打印:--111,并崩溃

工作中,一般设置不可变字符串、数组、字典的修饰符为copy,可变的为strong。copy是在属性的setter里执行了一步copy操作,strong是对对象的引用计数+1。由以上两段代码看出,当属性为可变,如果使用一个可变对象对其进行赋值时,所声明的属性都出现了意料之外的变化。第一段中strong修饰之后,self.stringMutable会随着tempString的改变而改变,第二段中copy修饰之后,self.stringMutable在被赋值后变为了不可变类型(深拷贝),再对其添加可变方法就会崩溃。
所以,可变类型必须要用strong修饰,但strong同样存在问题,需要在实际工作中根据相应的业务做处理。

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

相关阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,023评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,902评论 1 32
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 8,041评论 2 9
  • Kindle 看完这本书,其实我已经看过很多这类的书了。就像李笑来在书里说的一样,就是这么个道理不管你问哪个老师,...
    君喵喵阅读 1,409评论 0 0
  • 亲爱的花儿们大家周末好![微笑] [鼓掌][鼓掌][鼓掌]本周观看由活泼乖巧的孟芮桐给花儿们推荐的微电影《妈妈我错...
    甜甜的果阅读 4,032评论 0 0

友情链接更多精彩内容