Code Bye

oc循环引用问题

遇到一个问题:
这样写会导致循环引用,好理解:
self.block = ^{
NSLog(@”%@”, self.ob1);
};
但是这样就obj1能正常释放了,理解不了:
BlockOb *tempOb = self.ob1;

self.block = ^{
NSLog(@”%@”, tempOb);
};
谁帮忙解析一下!(BlockOb是继承NSobject,仅重写了dealloc, ob1时BlockOb对象)

解决方案

10

没有在block块内部声明的变量对于block来说都叫做外部变量,对于外部变量,假如是常量,在运行block块的时候会直接将值拷贝过来,假如是对象,block会使用强引用直接捕获这个对象,即拥有了这个对象。
self.block = ^{
        NSLog(@"%@", self.ob1);
};

这段代码,编译器会将代码块中的self.ob1看作是self->ob1,block会捕获你的self而不是ob1,这个是规则。
你自身就拥有这个block作为实例变量,又在这个block中强引用self,自然就是强引用循环了。
要想改写的话,楼上说的不全面,不仅要在block外改变self为弱引用,还要防止弱引用的对象随时被释放而使用局部强引用。

__weak Class * weakSelf = self;
self.block = ^{
        Class * innerSelf = weakSelf;
        NSLog(@"%@", self.ob1);
};

不知理解了没有。

40


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明oc循环引用问题