属性关键字的作用
readwrite:可读可写特性;需要生成getter方法和setter方法时(补充:默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数))
readonly:只读特性;只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变
assign:赋值特性;setter方法将传入参数赋值给实例变量;仅设置变量
copy:拷贝特性;setter方法将传入对象复制一份;需要完全一份新的变量时
retain:持有特性;setter方法将传入参数先保留,再赋值,传入参数的retainCount会 + 1
nonatomic:非原子操作;决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic
weak:“非拥有关系”;为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特性同assign类似,然后在属性所指的对象遭到摧毁时,属性值也会清空,弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。
strong:修饰符表示指向并持有该对象,其修饰对象的引用计数会加1。该对象只要引用计数不为0就不会被销毁。当然可以通过将变量强制赋值 nil 来进行销毁。
unsafe_unretain:类似于 weak ,但是当对象被释放后,指针已然保存着之前的地址,被释放后的地址变为 僵尸对象,访问被释放的地址就会出问题,所以说他是不安全的。
weak 和 assign 区别
arc情况下为了防止循环引用让其中一端使用weak来修饰例如:delagate,本身已经对其强引用,自定义IBOutlet控件属性一般也用weak。
weak修饰的属性表明一种非拥有关系。为这个属性赋值set的时候,set方法既不保留新值也不释放旧值,属性所指向的对象遭到销毁时,属性值会自动置为nil。而在oc中assgin一般用来修饰基本类型(int,float等),assign可以修饰非oc对象而weak必须修饰oc对象。
两者都是弱引用,assign通常用于普通类型属性(如int,NSInteger),还有代理属性的修饰,基本上来说两者是可以通用的。
只是后者比前者多了一个功能,后者会在引用的对象被释放的时候将该属性置为nil,而前者依然会指向原来的位置,这样就会变成野指针。在oc中你给你一个nil对象发送消息不会crash,但是给一个对象发送他不能解析的消息是会crash的,所以总的来说weak要比assign安全一些。
像delegate属性建议用weak修饰而不是assign。
retain 和 strong 区别
他俩都是强引用,除了某些情况下不一样,其他的时候也是可以通用的。
在修饰block属性的时候,相信大家都知道要用copy,如果不copy的话,他的生命周期会随着函数的结束而结束,copy之后会放在堆里面,延长block的生命周期。
strong在修饰block的时候就相当于copy,而retain修饰栈block的时候就相当于assign,这样block会出现提前被释放掉的危险。
__weak 和 __unsafe_unretain 的区别
__weak 是 __unsafe_unretain升级版,__unsafe_unretain 在指向的内存地址销毁后,指针本身并不会自动销毁,这也就造成了野指针(没有进行初始化的指针),之后容易造成 Crash。__weak 在指向的内存销毁后,可以将指针变量置为 nil,这样更加安全。
网友评论