如下属性有什么问题

@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

你可能感兴趣的:(如下属性有什么问题)