1,先给大家推荐一篇博文,关于arc下使用代码块避免循环的,对我的帮助比较大,原文地址:http://www.cnbluebox.com/?p=255%3C/p%3E
2,我总结一下我对于使用代码块时block对相应变量的一些处理:(有可能出现错误,希望大家指正)
在非arc环境下,先来看普通变量的变化,如下代码:
UILabel * __block label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 20.0f)];
NSLog(@"label_RetainCount:%d",[label retainCount]);
self.block = [^(void){
label.frame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
NSLog(@"label_RetainCount:%d",[label retainCount]);
} copy];
self.block();
第一次输出的引用计数是1,第二次输出的是2(代码块中的),说明代码块将变量进行的retain操作,然后将普通变量加上__block 修饰符
UILabel * __block label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 20.0f)];
NSLog(@"label_RetainCount:%d",[label retainCount]);
self.block = [^(void){
label.frame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
NSLog(@"label_RetainCount:%d",[label retainCount]);
} copy];
self.block();
两次输出的都是1,说明了代码块对于label没有进行任何处理,就单单传递了它的指针给代码块
在arc环境下,对于普通变量(__strong修饰符),block会对它进行强引用,所以容易产生block循环。解决的方法是使用__weak修饰符,假如除了不进行强引用还需要修改变量值的话可以增加一个__block修饰符,比如__block id __weak obj;