标签:
在ARC环境下,我们常常会使用weak 的修饰符来修饰一个变量,防止其在block中被循环引用,但是有些特殊情况下,我们在block中又使用strong 来修饰这个在block外刚刚用__weak修饰的变量,为什么会有这样奇怪的写法呢?
在block中调用self会引起循环引用,但是在block中需要对weakSelf进行
strong,保证代码在执行到block中,self不会被释放,当block执行完后,
会自动释放该strongSelf;
第一步:我们自定义一个类,在该类dealloc方法中加一行打印语句;
@interface sampleObject :NSObject @end @implementation sampleObject - (void)dealloc{ NSLog(@"dealloc %@",[self class]); } @end
第二步:实例化该类,并在block中调用它;(没有加strong修饰符,三秒后在另一个异步线程中释放该对象)
sampleObject *sample = [[SampleObject alloc]init]; self.sample= sample; __weakSampleObject* weaksample = self->sample; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ NSIntegercount =0; //__strong SampleObject* strongsample = weaksample; while(count<10) { count++; NSLog(@"aaa %@",weaksample); sleep(1); } }); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{ self.sample =nil; });
打印结果如下(没有用strong修饰符的打印结果如下):
那么好,我们在把第二步中的方法修改一下,加上strong修饰符:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ __strongSampleObject* strongsample = weaksample; NSIntegercount =0; while(count<10) { count++; NSLog(@"aaa %@",strongsample); sleep(1); } });
打印结果如下:
block 中使用__weak 和__strong修饰符的问题
标签:
原文地址:http://www.cnblogs.com/AntonyGu/p/5672818.html