assign与weak
两者都是弱引用,
assign通常用于普通类型属性(如int,NSInteger),
assign简单赋值,只进行值释放。这就导致野指针存在,即当这块地址还没写上其他值前,能输出正常值,但一旦重新写上数据,该指针随时可能没有值,造成崩溃。
weak用于修饰OC对象,两者都不更改索引计数(Reference Counting)
只是后者比前者多了一个功能,后者会在引用的对象被释放的时候将该属性置为nil,而前者依然会指向原来的位置,这样就会变成野指针。在oc中你给你一个nil对象发送消息不会crash,但是给一个对象发送他不能解析的消息是会crash的,所以总的来说weak要比assign安全一些。像delegate属性建议用weak修饰而不是assign。
weak和strong不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。
strong和retain
声明属性时用strong或者retain效果是一样的,都是强引用,除了某些情况下不一样,其他的时候也是可以通用的。
不过在声明Block时,使用strong和retain会有截然不同的效果。strong会等于copy,而retain竟然等于assign!strong在修饰block的时候就相当于copy,而retain修饰block的时候就相当于assign,这样block会出现提前被释放掉的危险。
当然定义Block还是应该用copy(还有其他需要注意的地方,可以参考这篇文章:iOS: ARC和非ARC下使用Block属性的问题),因为非ARC下不copy的Block会在栈中,ARC中的Block都会在堆上的。
copy会重新开辟新的内存来保存一份相同的数据。被赋值对象和原值修改互不影响。
strong和weak赋值都指向原来数据地址,区别是前者会对数据地址进行引用计数+1,后者不会
retain:自动帮我们生成getter/setter方法,并且生成的是内存管理代码(引用计数器+1)。 assign:不会自动帮助我们在setter/getter方法中生成内存管理代码,仅仅生成普通的