多线程设置属性引发的崩溃问题

多线程同时存和取公共变量容易导致崩溃,这个很好理解。那么只是同时调用普通的setter方法呢?

ARC环境测试代码如下,变量都是@property属性

对setter方法进行加锁就可以避免崩溃

MRC测试代码

一个特例:

字符串是族类,有  如下三种子类

  • NSCFConstantString: 字符串常量,放在常量区,对其retain或者release不影响它的引用计数,程序结束后释放。用字面量语法创建出来的string就是这种,比如str = @"1234"

  • NSTaggedPointerString: Tagged Point,标签指针,苹果在64位环境下对NSString和NSNumber做的一些优化,简单来说就是把对象的内容存放在了指针里,这样就不需要在堆内存里在开辟一块空间存放对象了,一般用来优化长度较小的内容.对于NSString,当非字面量的数字,英文字母字符串的长度小于等于9的时候会自动成为NSTaggedPointerString类型。NSTaggedPointerString也是不会释放的,它的内容就在本身的指针里。比如str = [NSString stringWithFormat:@"1234"]
  • NSCFString: 这种string就和普通的对象很像了,储存在堆上,有正常的引用计数,需要程序员分配释放。比如str = @"1234".mutableCopy
原文地址:https://www.cnblogs.com/zhangmaliang/p/6483507.html