Contents
  1. 1. strong&weak
  2. 2. atomic&nonatomic
  3. 3. retain&assign
  4. 4. copy
  5. 5. readwrite&readonly
  • @synthesize
  • @dynamic
  • strong&weak

    strongweakARC新引入的对象变量属性,strong相当于MRC的retain,而weak相当于assign
    ARC的一个基本规则即是,只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁。这就像放风筝,对象相当于风筝,strong引用就像一根线,一个风筝可以连多根线,只要还有一根线连着风筝就不会飘走;而weak引用就像用望远镜看风筝,你可以欣赏到它的美,但你不能阻止它飘走。

    atomic&nonatomic

    atomic(原子性):默认属性,编辑器合成的getter和setter方法会保证get、set操作的完整性,不受其它线程的影响。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    - (void)setName:(NSString *)name {
    @synchronized (self) {
    if (_name != name) {
    [_name release];
    _name = [name retain];
    }
    }
    }

    - (NSString *)name {
    @synchronized (self) {
    return _name;
    }
    }

    然而atomic并不能保证线程安全,它只能保证getter不会访问到setter方法执行当中该属性的值,但不能保证在并行地执行多个setter和getter时getter会返回什么值。

    一般情况下,iOS程序的所有属性都声明为nonatomic,是因为。在iOS中使用同步锁的开销比较大,这会带来性能问题,并且atomic并不能保证线程安全。想要实现线程安全,还需要采用更为深层的锁定机制。
    关于@synchronized,这篇博文:iOS开发笔记–关于 @synchronized,这儿比你想知道的还要多 讲得非常详细

    retain&assign

    retainassignMRC时期的关键字
    使用retain属性后自动生成的setter方法与下类似:

    1
    2
    3
    4
    5
    6
    -(void)setName:(test *)newname {  
    if (_name!= newname) {
       [_name release];
       _name= [newname retain];
    }
    }

    这会使对象的引用计数器+1
    而assing属性生成的setter方法会直接赋值而不进行retain操作。

    copy

    使用copy属性生成的setter方法如下:

    1
    2
    3
    4
    5
    6
    -(void)setName:(test *)newname {  
    if (_name!= newname) {
       [_name release];
       _name= [newname copy];
    }
    }

    这与上面retain生成的setter方法很类似,只是在赋值时使用的是copy方法,让我们回到放风筝的例子里,使用copy属性就相当于你看到一个风筝很好看,你也想放那个风筝,那么你并不会从那个风筝上多连一根线到你手上,而是去买一个一模一样的风筝旁边的一块地方放你自己的风筝,这就是copy
    值得注意的是,重写copy类型的setter方法时记得在赋值时用copy,否则外面的copy就是摆设。

    readwrite&readonly

    这两个属性的作用正如它们的名字所述:

    • readwrite: 产生setter\getter方法
    • readonly: 只产生getter,没有setter。

    @synthesize

    synthesize中文意思为‘合成’,添加对应属性的@synthsize语句后,在编译的过程中,编译器会帮你自动生成gettersetter方法,而现在的XCode在你声明属性后会自动帮你添加@synthesize语句:

    1
    @synthesize propertyName

    这样你就可以通过_propertyName或者self.propertyName来访问属性了,不过,@synthesize还有这样的写法:

    1
    @synthesize propertyName=asuijhdiuahwdiuawbndjbawjhbfc

    好的,现在你可以用asuijhdiuahwdiuawbndjbawjhbfc来访问属性了。

    @dynamic

    dynamic中文意思为‘动态’,添加@dynamic语句后,编译器不会自动生成getter和setter方法,需要自己实现。
    有些存取是在运行时动态创建的,如在CoreData的NSManagedObject类使用的某些。如果你想在这些情况下,声明和使用属性,但要避免缺少方法在编译时的警告,你可以使用@dynamic动态指令,而不是@synthesize合成指令。

    Contents
    1. 1. strong&weak
    2. 2. atomic&nonatomic
    3. 3. retain&assign
    4. 4. copy
    5. 5. readwrite&readonly
  • @synthesize
  • @dynamic