学习了下关于iOS属性关键字,最近面试经常会遇到相关问题,记录下笔记。
学习阶段,如果哪部分有问题,欢迎指正,共同探讨。@Apach3
现在最常用的写法就是:
@property (nonatomic, strong) UILable *myLabel;
定义一个UILabel,依次解读下:
@property
:
程序在编译阶段自动生成getter
和setter
方法。我理解的就是 @property……
一句话,就代替了声明成员变量、属性、再@synthesize 成员变量 = _对应属性;
。这样剩去了好多行代码,还可以在属性关键字设置相应的作用。
(……)
:
括号内的是属性关键字。对于普通OC对象来说,默认的修饰符是atomic
、strong
、readwrite
;对于基本数据类型来说,默认修饰符是nonatomic
、assign
、readwrite
。
括号后面的就是数据类型还有相关名称。
着重把自己理解的各个属性关键字解释一下,面试的时候按这么说基本不会挂。
readwrite
:
可读可写属性,默认是这个属性,系统会自动生成getter
和setter
方法。
readonly
:
可读属性,不可写。自动生成getter
方法不生成setter
方法。
nonatomic
:
非原子属性,线程不安全的,无锁。但更经常用nonatomic
,在多线程并发访问时会提高性能。
atomic
:
原子属性,线程安全,有锁。
copy
:
建立一个索引计数为1的对象,在赋值时,使用传入值的一份拷贝。
retain
:
表示持有属性,强引用,当前对象在被其他对象调用的时候引用计数会自动+1,直到引用计数变为0才会被销毁。setter
方法中,读取对象先release
,再进行retain
操作。
assign
:
表示赋值属性,应用于基本数据类型,因为基本数据类型是被分配在栈上的某块内存,栈上的内存是由系统自动分配,所以不会出现野指针。setter
方法直接赋值,当对象被销毁后,指针不会自动赋nil
,会出现野指针。
strong
:
表示强引用,ARC
下使用。当前对象被其他对象调用时引用计数会自动+1,相当于retain
。同copy
不同的是,strong
是两个指针指向同一块内存空间,而copy
是拷贝了一份新的空间,两个指针指向不同的内存地址。
weak
:
表示弱引用,ARC
下使用。当前对象的生命周期不被是否由其他对象引用限制,它本该什么时候销毁就什么时候被销毁。即使它的引用没断,但是当它的生存周期到了时就会被销毁。当对象被销毁后,指针自动赋nil
。常用在delegate
、连线上,防止循环引用。
刚开始学习这部分的时候,还不是特别理解。后来组对记忆,发现有相似的地方,有MRC
转ARC
的变化,也有强弱之间的对比,还有相应的一些小对比,瞬间记得变快了。
加油!