A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

@property参数


1.    @property复习


   1)作用:
               a. 自动生成私有属性
               b. 自动生成setter和getter方法的声明
               c. 自动生成setter和getter方法的实现



          特别播报:
               生成的setter方法的实现中,无论是什么类型的,都是直接赋值。


2.    @property参数


     1)@property可以带参数的。
          语法:
               @property(参数1,参数2,参数3...)数据类型 名称;


     2)介绍一下@property的四组参数:
          a. 与 多线程相关 的两个参数:
               atomic、nonatomic
          b. 与生成的 setter方法的实现相关 的两个参数:

               assign、retain
          c. 与生成 只读、读写相关 的两个参数:
               readonly、readwrite
          d. 与生成的 setter 和 getter方法名字 相关 的两个参数:
               setter、getter




3.    与 多线程相关 相关的两个参数:


     1)atomic:默认的。如果写atomic,这个时候生成的setter方法的代码就会加上1把线程安全锁。
          特点:安全,效率低下。
     2)nonatomic:如果写nonatomic,这个时候生成的setter方法的代码就不会加线程安全锁。
          特点:不安全,但效率高。


     建议:要效率,选择使用nonatomic,在没有讲解多线程的知识以前,统统使用nonatomic


4.    与 生成的setter方法实现 相关的两个参数:


     1)assign:默认的。生成的setter方法直接赋值。
     2)retain:生成的setter方法的实现就是标准的MRC内存管理代码。
                    也就是,先判断新旧对象是否是同1个对象,如果不是release旧的,retain新的。


     当属性的类型是OC对象类型的时候,那么就使用retain参数。
     当属性的类型是非OC对象的到时候,就使用assign参数。


     千万注意:
          retain参数,只是生成标准的setter方法为标准的MRC内存管理代码,不会自动的在dealloc中生成release的代码。
          所以,我们还要手动的在dealloc中release。


5.    与 生成只读、读写封装的 相关的两个参数:


     1)readwrite:默认的。代表同时生成setter和getter方法
     2)readonly:只会生成getter方法,而不会生成setter方法。


6.    与 生成的setter和getter方法名字 相关的两个参数:


     默认情况下,@property生成的setter和getter方法的名字都是最标准的名字。
     其实我们可以通过参数来指定@property生成的方法的名字。


     1)setter=setter方法名字,用来指定@property生成的setter方法的名字。注意:setter方法是带参数的,所以方法名字一定要记得冒号!
       即:
     @property(nonatomic,retain,setter=ooo:) NSString *name;
     此时生成的setter方法的名字就是:
     -(void)ooo:(NSString *)xxx;


     2)getter=getter方法名字,用来指定@property生成的getter方法的名字。
     即:
     @property(nonatomic,retain,setter=ooo:,getter=xxx) NSString *name;
     此时生成的getter方法的名字就是:
     -(NSString *)xxx;


记住:
     如果使用setter和getter两个参数修改了生成的方法的名字。那么在使用点语法的时候,编译器就会自动转换为调用修改后的方法的名字的代码。


使用注意:
     1)无论什么情况都不要改setter方法的名字,因为默认情况下生成的名字就已经是最标准的了!
     2)而getter方法的名字可以在属性的类型是BOOL类型的时候,修改为以is开头的名字,可以提高代码的阅读性。


7.    总结:


     1)与多线程相关的参数:直接用nonatomic
     2)与生成setter方法实现相关的两个参数:
     属性若是OC对象的时候,就用retain,否则,用assign
     3)只读、读写封装相关的两个参数:
     如果希望生成的封装是只读封装,也就是只生成getter方法,那就用readonly,否则,就用readwrite,也就是默认的。
     4)无论什么情况都不要改setter方法的名字,因为默认情况下生成的名字就已经是最标准的了!而getter方法的名字可以在属性的类型是BOOL类型的时候,修改为以is开头的名字,可以提高代码的阅读性。


2 个回复

倒序浏览
赞赞更健康
回复 使用道具 举报
可以,借用了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马