@property(copy)NSMutableArray *arr;
该写法总共有两个问题
- 1.使用该属性会崩溃
- copy策略可以创建可变对象或不可变对象的不可变副本,对象的值不可以改变
/// 创建并不会引起崩溃
self.array = [NSMutableArray array];
/// 该句引起的崩溃
[self.array addObject:@""];
* 如上使用会引起崩溃如下,明显可以看到该属性的实际类型是NSArray,值不可以改变,进行改变自然会崩溃
[__NSArray0 addObject:]: unrecognized selector sent to instance 0x6040000086b0
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArray0 addObject:]: unrecognized selector sent to instance 0x6040000086b0'
*** First throw call stack:
-
2.性能和线程安全问题
下面先来解释一下nonatomic与atomic的区别与作用
* atomic 保证程序在多线程情况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。 * nonatomic 如果该对象无需考虑多线程的情况,加入这个属性,会让编译器少生成一些互斥加锁代码,可以提高效率 * atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操作,系统自动生成的 getter/setter 方法不一样。atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择了atomic 那么就是说,系统会自动的创建lock锁,锁定变量。nonatomic禁止多线程,变量保护,提高性能。
-
如果没有指定默认使用atomic
网友评论