iOS中strong,weak,assign,copy,atom

2020-09-10  本文已影响0人  一个半吊子工程师
关键字
@property (nonatomic, assign) int number; 
@property (nonatomic, assign) id className;//id必须用assign 
反正记住:前面不需要加 “*” 的就用assign吧 

weak和strong的区别:

weak和strong不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。

weak和assign的区别:

weak 只可以修饰对象;
weak 不会产生野指针问题。因为weak修饰的对象释放后(引用计数器值为0),指针会自动被置nil,之后再向该对象发消息也不会崩溃。 weak是安全的。
assign 可修饰对象,和基本数据类型;
assign 如果修饰对象,会产生野指针问题;如果修饰基本数据类型则是安全的。修饰的对象释放后,指针不会自动被置空,此时向对象发消息会崩溃。

__block和__weak修饰符的区别:

__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
__block对象可以在block中被重新赋值,__weak不可以。

copy与retain的区别:

Copy创建一个新对象,表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。
retain创建一个指针,引用对象计数加1,表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1。
也就是说,retain指针拷贝copy内容拷贝

assign与retain:

assign: 简单赋值,不更改索引计数;
assign的情况:NSString *newPt = [pt assing];

此时newPt和pt完全相同 地址都是0Xaaaa 内容为0X1111 即newPt只是pt的别名,对任何一个操作就等于对另一个操作, 因此retainCount不需要增加;
assign就是直接赋值;

retain使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收;
retain的情况:NSString *newPt = [pt retain];

此时newPt的地址不再为0Xaaaa,可能为0Xaabb 但是内容依然为0X1111。 因此newPt 和 pt 都可以管理"abc"所在的内存,因此 retainCount需要增加1;

上一篇下一篇

猜你喜欢

热点阅读