特殊指示符

 

@property 属性和类型之间用括号添加一些额外的指示符,可使用的特殊指示符,如下:

 

1. assign : 该指示符指定对属性只是进行简单赋值,不更改对所赋的值的引用计数。

         这个指示符主要用于NSInter等基础类型,以及short , float , double, 结构体等各种C数据类型。  

 

    提示:引用计数是OC内存回收的概念,当一个对象的引用计数大于0时,表明该对象还不应该被回收。

       由于NSInteger等基础类型,以及short , float , double, 结构体等各种C数据类型都不存在回收的问题,

     因此使用assign即可!   

 

 

2. atomic(nonatomic): 指定合成的存取方法是否为原子操作。

  所谓原子操作,主要指是否线程安全。

  如果使用atomic,那么合成的存、取方法都是线程安全的 ——  当一个线程进入存、取方法的方法体之后,

  其他线程无法进入该存、取方法,这样就可以避免多线程并发破坏对象的数据完整性, atomic是默认值。

  虽然atomic可以保证对象数据的完整性,但atomic的线程安全会造成性能下降,因此,大多数单线程环境下,

  我们都会考虑使用nonatomic来提高存取方法的访问性能。

 

3. copy :如果使用copy指示符,当调用setter方法对成员变量赋值时,会将被赋值的对象复制一个副本,

    再将该副本赋值给成员变量。 copy指示符会将成员变量所引用对象的引用计数减 1 . 

    当成员变量的类型是可变类型,或其子类是可变类型时,被赋值的对象有可能在赋值之后被修改,

    如果程序不需要这种修改影响setter方法设置的成员变量的值,此时就可考虑使用copy指示符。

 

  例子:@property (nonatomic,  copy)  NSString * name ;   

 

4.  readonly,   readwrite : 

   readonly 指示系统只合成getter方法, 不再合成setter方法;

   readwrite  是默认值,指示系统需要合成setter,getter方法。

 

5.  retain :  使用retain指示符定义属性时,

    当把某个对象赋值给该属性时,该属性原来所引用的对象的引用计数减1 ,

    被赋值对象的引用计数加1 。 

 

  提示:在未启用ARC机制的情况下,retain是一个很有用的指示符:当一个对象的引用计数大于1时,

      该对象不应该被回收,但启动ARC机制之后,一般较少使用retain指示符。

 

  例子: 

    @property  (nonatomic , retain )  NSDate * date;

 

 

 

6.  strong, weak:

  strong指示符指定该属性对被赋值对象有强引用,

  而weak指示符指定属性对被赋值对象持有弱引用。

  

  强引用的意思是: 只要改强引用指向被赋值的对象,那么该对象就不会自动回收;

  弱引用的意思是:即使该弱引用指向被赋值的对象,该对象也可能被回收。

 

7.   unsafe_unretained:  这个指示符与weak指示符基本相似,对应unsafe_unretained指针所指向的对象,

  该对象也可能被回收。

  与weak不同的是,当unsafe_unretained指针所引用的对象被回收后,unsafe_unretained指针不会被赋值为nil,

  因此这可能导致程序崩溃。

  一般来说,使用unsafe_unretained指示符不如使用weak指示符。

 

 

    提示:在启动ARC机制时,使用strong,weak指示符将十分方便。

        如果程序不希望被属性引用的对象被回收,那么就应用使用strong指示符;

        如果程序需要保证性能,避免内存溢出,则可以使用weak指示符。

        使用weak指示符时需要小心,当程序通过该weak属性来访问被引用的对象时,

        该对象可能已经被回收了。 

        对于声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。

        这样能有效地防止悬空指针。

        weak指示符可有效地帮我们防止悬空指针。

 

 

 

 

 

 

posted @ 2014-12-09 10:19  Sunrise0707  阅读(115)  评论(0)    收藏  举报