美文网首页
iOS delegate用weak修饰和assign修饰的区别

iOS delegate用weak修饰和assign修饰的区别

作者: 恋空K | 来源:发表于2019-07-18 16:17 被阅读0次

    1.对于strong:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用(Retain Cycles)

    2.对于assign:也有weak的功效。assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针;而weak一旦不进行使用后,永远不会使用了,就不会产生野指针。

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

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

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

    3.对于weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制。

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

    所以答案就是,使用weak。

    @interface MyObject : NSObject

    {

      myBlock  blk;

      id _obj;

    }

    @end

    @implementation MyObject

    - (id)init

    {

        self = [super init];

        blk = ^{ NSLog(@"_obj = %@", _obj); };

        return self;

    }

    @end

    上面的例子中,虽然没有直接使用 self,却也存在循环引用的问题。因为对于编译器来说,_obj就相当于self->_obj,所以上面的代码就会变成

    blk = ^{ NSLog(@"_obj = %@", self->_obj); };

    内存管理是程序设计中很重要的一部分,程序在运行的过程中消耗内存,运行结束后释放占用的内存。如果程序运行时一直分配内存而不及时释放无用的内存,会造成这样的后果:程序占用的内存越来越大,直至内存消耗殚尽,程序因无内存可用导致崩溃,这样的情况我们称之为内存泄漏。

    在ObjC中,对象什么时候会被释放(或者对象占用的内存什么时候会被回收利用)?

    答案是:当对象没有被任何变量引用(也可以说是没有指针指向该对象)的时候,就会被释放。

    ARC能帮我们简化内存管理问题,但不代表它是万能的,还是有它不能处理的情况,这就需要我们自己手动处理,比如循环引用、非ObjC对象、Core Foundation中的malloc()或者free()等等

    4.4 无限循环

    这个是比4.3更极端的情况,无论你出于什么原因,当你启动了一个无限循环的时候,ARC会默认该方法用不会执行完毕,方法里面的对象就永不释放,内存无限上涨,导致内存泄漏。

    例子:

    相关文章

      网友评论

          本文标题:iOS delegate用weak修饰和assign修饰的区别

          本文链接:https://www.haomeiwen.com/subject/dhwllctx.html