@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开头的名字,可以提高代码的阅读性。
|
|