IOS中Block的循环引用
时间:2014-05-01 20:28:37
收藏:0
阅读:917
@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方法不会被调用,或者没有完全被调用。
评论(0)