objective-c中的属性

@property中的声明列表已分类为如下几种:多线程

1, 声明属性的访问方法:atom

  • getter=getterName
  • setter=setterName
    声明访问属性的设置与获取方法名。

2,声明属性写操做权限:spa

  • readwrite
    声明此属性为读写属性,便可以访问设置方法(setter),也能够访问获取方法(getter),与readonly互斥。
  • readonly
    声明此属性为只读属性,只能访问此属性对应的获取方法(getter),与readwrite互斥。

3,声明写方法的实现:线程

  • assign
    声明在setter方法中,采用直接赋值来实现设值操做。如:

-(void)setName:(NSString*)_name{
     name = _name;
}

retain

声明在setter方法中,须要对设过来的值进行retain 加1操做。如:code

-(void)setName:(NSString*)_name{
     //首先判断是否与旧对象一致,若是不一致进行赋值。
     //由于若是是一个对象的话,进行if内的代码会形成一个极端的状况:当此name的retain为1时,使这次的set操做让实例name提早释放,而达不到赋值目的。
     if ( name != _name){
          [name release];
          name = [_name retain];
     }
}

  • copy
    调用此实例的copy方法,设置克隆后的对象。实现参考retain。

4,访问方法的原子性:对象

  • nonatomic
    在默认的状况下,经过synthesized 实现的 setter与getter 都是原子性访问的。多线程同时访问时,保障访问方法同时只被访问一个线程访问,如:

[ _internal lock ]; // lock using an object-level lock
id result = [ [ value retain ] autorelease ];
[ _internal unlock ];
return result;

但若是设置nonatomic时,属性的访问为非原子性访问。内存

总结: 须要全局访问的变量尽可能声明成属性来进行赋值,声明成成员变量没法保持引用计数的一致性从而致使崩溃,在内部访问数据时使用成员变量或属性都是能够的,在对属性进行赋值时,会调用属性的set方法,使引用计数加一从而保证内存的正确引用。get

相关文章
相关标签/搜索