快乐的鲸鱼

property 参数

2016/01/29

截取自 Objective-C中的@property

@property 是生命属性的语法,它可以快速方便的为实例变量创建存取器。

存取器(accessor) : 指用于获取和设置实例变量的方法。用于获取实例变量值的存取器getter,用于设置实例变量值的方法是setter

@property的特性(参数)

@property有几种类型的关键字,都是有特殊作用的。我们大概分成四类,分别是:多线程相关,内存管理,存取器控制,存取器命名。

多线程相关

  • atomic(默认):生成多线程管理代码,效率也较低,在iOS开发不常用。atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。
  • nonatomicnonatomic恰好与atomic相反。表示非原子的,可以被多个线程访问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。一般iOS开发都会使用这个。

内存管理

  • assign(默认):assign用于值类型,如intfloatdoubleNSIntegerCGFloat等表示单纯的复制。还包括不存在所有权关系的对象,比如常见的delegate。

  • retian:在setter方法中,需要对传入的对象进行引用计数加1的操作。

    简单来说,就是对传入的对象拥有所有权,只要对该对象拥有所有权,该对象就不会被释放。手动内存管理一般使用这个。效果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    -(void)setName:(NSString*)_name{  
    //首先判断是否与旧对象一致,如果不一致进行赋值。
    //因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的。
    if ( name != _name){
    [name release];
    name = [_name retain];
    }
    }
  • strongstrong是在iOS引入ARC的时候引入的关键字,是retain的一个可选的替代。表示实例变量对传入的对象要有所有权关系,即强引用。strongretain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。

  • weak:在setter方法中,需要对传入的对象不进行引用计数加1的操作。

    简单来说,就是对传入的对象没有所有权,当该对象引用计数为0时,即该对象被释放后,用weak声明的实例变量指向nil,即实例变量的值为0。

  • copy:与strong类似,但区别在于实例变量是对传入对象的副本拥有所有权,而非对象本身。

存取器控制

  • readwrite(默认):readwrite是默认值,表示该属性同时拥有settergetter
  • readonlyreadonly表示只有getter没有setter

存取器命名

有时候为了语意更明确可能需要自定义访问器的名字:

1
@property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name;

最常见的是BOOL类型,比如标识View是否隐藏的属性hidden。可以这样声明:

1
@property (nonatomic,getter = isHidden ) BOOL hidden;
CATALOG
  1. 1. @property的特性(参数)
    1. 1.0.1. 多线程相关
    2. 1.0.2. 内存管理
    3. 1.0.3. 存取器控制
    4. 1.0.4. 存取器命名