使用block时如何避免循环引用

RT

- (void)dealloc
{
 
    NSLog(@"no cycle retain");
}
 
- (id)init
{
    self = [super init];
    if (self) {
 
#if TestCycleRetainCase1
 
        //会循环引用
        self.myblock = ^{
 
            [self doSomething];
        };
#elif TestCycleRetainCase2
 
        //会循环引用
        __block TestCycleRetain *weakSelf = self;
        self.myblock = ^{
 
            [weakSelf doSomething];
        };
 
#elif TestCycleRetainCase3
 
        //不会循环引用
        __weak TestCycleRetain *weakSelf = self;
        self.myblock = ^{
 
            [weakSelf doSomething];
        };
 
#elif TestCycleRetainCase4
 
        //不会循环引用
        __unsafe_unretained TestCycleRetain *weakSelf = self;
        self.myblock = ^{
 
            [weakSelf doSomething];
        };
 
#endif
 
        NSLog(@"myblock is %@", self.myblock);
 
    }
    return self;
}
 
- (void)doSomething
{
    NSLog(@"do Something");
}
 
int main(int argc, char *argv[]) {
    @autoreleasepool {
        TestCycleRetain* obj = [[TestCycleRetain alloc] init];
        obj = nil;
        return 0;
    }
}
经过上面的测试发现,在加了__weak和__unsafe_unretained的变量引入后,TestCycleRetain方法可以正常执行dealloc方法,而不转换和用__block转换的变量都会引起循环引用。
因此防止循环引用的方法如下:
__unsafe_unretained TestCycleRetain *weakSelf = self;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值