首页 > 代码库 > IOS中Block的循环引用
IOS中Block的循环引用
@interface DemoObj() @property (nonatomic, strong) NSOperationQueue *queue; @end @implementation DemoObj - (instancetype)init { self = [super init]; if (self) { self.queue = [[NSOperationQueue alloc] init]; } return self; } - (void)dealloc { NSLog(@"demoobj dealloc"); } - (void)demoOp:(id)obj { NSLog(@"%@ %@", [NSThread currentThread], obj); } - (void)demoBlockOp { // 不能用__weak // __weak DemoObj *weakSelf = self; // 只有self直接强引用block,才会出现循环引用 // block的管理以及线程的创建和销毁是由队列负责的,直接在block中使用self没有关系! for (int i = 0; i < 10; ++i) { [self.queue addOperationWithBlock:^{ [self demoOp:@(i)]; }]; } }
在viewcontroller里调用DemoObj的demoBlockOp方法,验证DemoObj是否会被销毁,这里是否会引起block的循环引用。
DemoObj *obj = [[DemoObj alloc] init];
[obj demoBlockOp];
事实证明这里不会引起循环引用,因为这里跟运行循环机制有关,在IOS中只有主线程设置了Run Loop,但是在其他子线程中就没有设置Run Loop的,其他线程是由队列管理的,执行完了之后就被销毁了,所以不会引起对self的强引用。
这里不能用__weak,因为使用了__weak之后,当出了demoBlockOp这个方法的"}"之后,obj对象就没有被引用了,就会释放了,就会造成demoOp方法不会被调用,或者没有完全被调用。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。