@property的中的关键字特性


@property还有一些关键字,它们都是有特殊做用的,好比上述代码中的nonatomic,strong:安全


@property(nonatomic,strong) NSString *carName;多线程

@property(nonatomic,strong) NSString *carType;atom

我把它们分为三类,分别是:原子性,存取器控制,内存管理。线程


原子性对象


atomic(默认):atomic意为操做是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。它是一个默认的特性,可是不多使用,由于比较影响效率,这跟ARM平台和内部锁机制有关。内存

nonatomic:nonatomic跟atomic恰好相反。表示非原子的,能够被多个线程访问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的状况下普遍使用。get

存取器控制it


readwrite(默认):readwrite是默认值,表示该属性同时拥有setter和getter。内存管理

readonly: readonly表示只有getter没有setter。效率

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


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

最多见的是BOOL类型,好比标识View是否隐藏的属性hidden。能够这样声明:


@property (nonatomic,getter = isHidden ) BOOL hidden;

内存管理


@property有显示的内存管理策略。这使得咱们只须要看一眼@property声明就明白它会怎样对待传入的值。


assign(默认):assign用于值类型,如int、float、double和NSInteger,CGFloat等表示单纯的复制。还包括不存在全部权关系的对象,好比常见的delegate。

@property(nonatomic) int running;

@property(nonatomic,assign) int running;

以上两段代码是相同的。


在setter方法中,采用直接赋值来实现设值操做:


-(void)setRunning:(int)newRunning{  

    _running = newRunning;  

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

简单来讲,就是对传入的对象拥有全部权,只要对该对象拥有全部权,该对象就不会被释放。以下代码所示:

-(void)setName:(NSString*)_name{  

     //首先判断是否与旧对象一致,若是不一致进行赋值。  

     //由于若是是一个对象的话,进行if内的代码会形成一个极端的状况:当此name的retain为1时,使这次的set操做让实例name提早释放,而达不到赋值目的。  

     if ( name != _name){  

          [name release];  

          name = [_name retain];  

     }  

}

strong:strong是在IOS引入ARC的时候引入的关键字,是retain的一个可选的替代。表示实例变量对传入的对象要有全部权关系,即强引用。strong跟retain的意思相同并产生相同的代码,可是语意上更好更能体现对象的关系。

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

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


注:weak关键字是IOS5引入的,IOS5以前是不能使用该关键字的。delegate 和 Outlet 通常用weak来声明。


copy:与strong相似,但区别在于实例变量是对传入对象的副本拥有全部权,而非对象自己。

相关文章
相关标签/搜索