将来跳槽用

iOS assign,weak,retain,strong,co

2018-09-29  本文已影响93人  路飞_Luck
一.assign 与weak区别
  1. 两者都是弱引用,assign通常用于基本数据类型,还有代理属性的修饰,weak是适用于NSObject对象,基本上来说两者是可以通用的。

  2. assign其实也可以用来修饰对象。那么我们为什么不用它修饰对象呢?因为被assign修饰的对象(一般编译的时候会产生警告:Assigning retained object to unsafe property; object will be released after assignment)在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil,造成野指针。对象一般分配在堆上的某块内存,如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。

  3. 那为什么可以用assign修饰基本数据类型?
    因为基础数据类型一般分配在栈上,栈的内存会由系统自己自动处理,不会造成野指针。

  4. weak修饰的对象在释放之后,指针地址会被置为nil。所以现在一般弱引用就是用weak。

weak使用场景:

二. retain和strong

他俩都是强引用,除了某些情况下不一样,其他的时候也是可以通用的。

  1. 在修饰block属性的时候,相信大家都知道要用copy吧,因为如果不copy的话,block是存放在栈连里面的,他的生命周期会随着函数的结束而出栈的,copy之后会放在堆里面。

  2. strong在修饰block的时候就相当于copy,而retain修饰block的时候就相当于assign,这样block会出现提前被释放掉的危险

三.strong 与copy的区别

strong 与copy都会使引用计数加1,但strong是两个指针指向同一个内存地址,copy会在内存里拷贝一份对象,两个指针指向不同的内存地址

四.__block与__weak的区别

block变量定义时为什么用copy?block是放在哪里的?

block的循环引用并不是strong导致的…在ARC环境下,系统底层也会做一次copy操作使block从栈区复制一块内存空间到堆区…所以strong和copy在对block的修饰上是没有本质区别的,只不过copy操作效率高而已

五.代理用weak还是assign, strong

经过一番研究,发现如果使用

 @property (nonatomic, assign, readwrite) id delegate;

会有crash,报错EXC_BAD_ACCESS

声明一个delegate,那么即便delegate指向的对象销毁了,delegate中依然会保存之前对象的地址,即delegate成为了一个野指针...

而使用weak,则不会有上述问题,当delegate指向的对象销毁后,delegate = nil,

所以答案就是,使用weak



本文参考 iOS学堂 的CSDN 博客 ,iOS 关于修饰代理用weak还是assign

本文参考 rootren的CSDN博客 iOS assign,weak,strong,copy 详解

iOS中copy,strong,retain,weak和assign的区别

上一篇 下一篇

猜你喜欢

热点阅读