标签:
苹果公司在Object-C 2.0 中引入了属性(property),它组合了新的预编译指令和新的属性访问语法。新的属性功能显著减少了必须编写的冗长代码的数量。
1 、@property关键字
可以使用@property关键字来声明类的属性(property),编译器能够自动生成属性名、setter方法、getter方法。其中@property是在@interface块中使用。
1.1 普通方式
如在myClass类中有_name属性,可以实现其setter和getter方法:
1.2 property方式
若使用@property关键字,则自动生成_name的成员变量,以及setName和name方法。
在Object-C中是不能像C/C++一样使用点表达式直接访问对象中的属性,需要通过消息进行访问。但通过@property就能够直接访问对象中的属性来。比如上述的AllWeatherRadial类:
2、@synthesize关键字
通过@property关键字声明的属性,编译器会自动生成一个实例变量,该变量的名字是在属性名前加下划线。可以使用@synthesize关键字从新指定实例变量的名字,即在@implementation文件中的某个方法使用的属性名,其有两种使用形式:
2.1 属性名形式
可以在@implementation文件中再此声明@property中定义的属性名,从而在@implementation中的方法只能使用@property定义的属性名,而不是在属性名前加下划线的名字。如下所示:
2.2 重命名形式
若不希望在@implementation的方法中使用属性命名的实例变量,也不希望使用下划线命名的实例变量,可以自定义自己希望的名字,同样是使用@property关键字。
3、@dynamic关键字
若不希望编译器自动生成实例变量名和存取方法,则可以使用@dynamic关键字在@implementation文件中进行声明。
4、属性特质
@property还可以设置属性的各种特质(attribute),从而影响编译器自动生成的setter和getter方法,其使用语法为:
表格 31 属性特质
参数 |
意义 |
|
原子性 |
atomic (默认) |
保证多线程访问下的安全, 但浪费系统资源, 原子性控制的默认设置. |
nonatomic |
禁止多线程,变量保护,提高性能。 |
|
读写属性 |
readwrite (默认) |
产生setter\getter方法。 |
readonly |
只产生简单的getter,没有setter, 默认的读写属性. |
|
内存管理 |
assign |
默认类型,为简单赋值,不更改引用计数,适用于标亮数据类型(scalar type);对对象类型,同样不会改变引用计数值。 |
strong (默认) |
该类型属性定义了一种"拥有关系",编译器会生成的setter方法会修改引用计数值。先增加新值的引用计数,再减少旧值的引用计数。 |
|
weak |
该类型属性定义了一种"非拥有关系",编译器生成的setter方法不会修改引用计数值,即不会增加引用计数,也不会减少引用计数。此特质与assign类似,然而当该属性被系统释放时,所有引用该对象的指针都会被置为nil。 |
|
unsafe_unretained |
该类型与assign类似,定义了一种"非拥有关系",同样不修改引用计数,当目标对象被释放时,所有引用该对象的指针不会被置为nil。 |
|
copy |
该类型与strong类似,然而该类型的setter方法并不会增加新值的引用计数,而是会创建一个新的对象(引用计数为1)。 |
|
retain |
与strong相对应,使用了引用计数,retain+1,release -1;当引用计数为0时,dealloc会被调用,内存被释放。 |
|
方法名 |
setter = |
指定生成setter方法的名字。 |
getter = |
指定生成getter方法的名字。 |
4.1 原子性
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
4.2 读写权限
4.3 内存管理
内存管理的6种属性特质中,可以分为ARC和非ARC类型:
面试题:
1) strong与weak的区别
strong类型的属性是一种拥有关系,即当调用strong类型属性的setter方法时,被传递参数的引用计数为+1,而原来属性值的引用计数会-1;而weak类型是一种非拥有关系,即当调用weak类型属性的setter方法时,不会修改任何引用计数,同时但weak属性被释放时,所有引用该对象的指针都会被置为nil。
2) assign、copy及retain的区别
4.4 方法名
面试题:
1) 在一个对象的方法里面:self.name = "object"和name ="object"的区别?
self.name = "object"会调用对象的setName()方法,而name = "object"会直接把object赋值给当前对象的name 属性。并且若name属性声明为strong或retain类型的特质,则 self.name 的retainCount会加1,而name就不会。
标签:
原文地址:http://www.cnblogs.com/hlwfirst/p/5439906.html