ios开发基础学习笔记(十一)--@property的使用

前言

大家好,我是milo,今天这篇文章讲的是@property在MRC和ARC下的使用和对比。

@property的参数

(1)线程方面
  atomic(默认):几乎不用,低性能 ,仅能保证读写安全(通过互斥锁),并不能保证线程安全。
  nonatomic:高性能,一般使用这个。

(2)内存管理方面
  1.MRC
  1> assign (默认): 基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端用assign,多对象时,也只需保持一端assign
  2> copy : 只用于NSString\block
  3> retain : 除NSString\block以外的OC对象

  2.ARC
  1> assgin(默认) : 基本数据类型、枚举、结构体(非OC对象)
  2> copy : 只用于NSString\block
  3> strong : 除NSString\block以外的OC对象(相当于retain)
  4> weak : 用于UI控件和delegate。当2个对象相互引用,一端用strong,一端用weak,多对象时,也只需保持一端weak(weak是弱引用,没有引用时释放内存和指针)

  !!!内存管理需要注意的地方:内存管理的关键字是通过在setter/getter方法里生成相关代码来实现内存管理的。
如:
当我们使用retain的时候:

@property(nonatomic,retain) Dog *dog;

实际上,setter/getter方法就变成了如下:

- (void)setDog:(Dog *)dog
{
   if(_dog != dog){          //判断是否需要重新赋值
      [_dog release];        //释放旧引用,计数器-1
      _dog = [dog retain];   //重新赋值,计数器+1
   }
}

跟我们所学的自己写的retain的管理一模一样(包括使用atomic上锁也是在setter/getter里面加@synchronized)

在这里就不展开逐个验证了,就上个结论:
1.retain:先release旧值,再retain新值
2.assign:直接赋值,不考虑内存管理。
3.copy:先release旧值,再copy新值,copy的本质为复制该内存所存储的内容,重新创建一个对象赋给其相同的内容,很明显,在copy这个过程中也发生了一次retain,不过这是个全新的对象。

(3)是否生成setter方法
  readwrite(默认):同时生成setter和getter的声明和实现
  readonly:只读,只会生成getter的声明和实现

(4)Set和get方法的名称
  修改set和get方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用在布尔类型中的getter。

@propery(nonatomic,getter=isRich) BOOL rich;
BOOL b=p.isRich;// 调用

  如果要修改set方法,记得在方法后面加个 “ :” ,因为set是带参数的,如:

@propery(nonatomic,setter=setIsRich:) BOOL rich;

你可能感兴趣的:(ios开发基础学习笔记(十一)--@property的使用)