学习了下关于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的变化,也有强弱之间的对比,还有相应的一些小对比,瞬间记得变快了。
加油!
1335

被折叠的 条评论
为什么被折叠?



