block应该注意的三个问题!
问题一:block对象的生命周期?
直接看代码,打印结果是什么?
#import<Foundation/Foundation.h>//定义block对象(全局block)int(^externBlock)(void)=^(void){return100;};//定义函数(block做为参数)voidfunction(int(^block)(void)){printf("执行block的结果是:%d\n\n",block());}//定义的两个函数voidfirstFunc(intnumber){//定义块对象(局部)int(^blockWithinFirst)(void)=^(void){returnnumber;};//调用外部的function函数function(blockWithinFirst);//赋值externBlock=blockWithinFirst;}voidsecondFunc(intnumber){//int局部变量intindex=10;//block局部对象int(^blockWithinSecond)(void)=^(void){returnnumber*index;};//调用外部function函数function(blockWithinSecond);}intmain(intargc,constchar*argv[]){@autoreleasepool{//1.调用function函数function(externBlock);//2.调用firstFuncfirstFunc(5);//3.调用secondFuncsecondFunc(10);//4.和步骤1一样function(externBlock);}return0;}
问题二:Block体中访问全局变量/局部静态变量/局部变量的问题,如何解决(考察__block类型)
#import<Foundation/Foundation.h>voidfunction(intnumber,void(^blockParam)(void)){//打印传入的number值printf("传入的number是:%d\n",number);//调用传入的block对象blockParam();}intglobalNumber=1000;//全局变量(外部变量)intmain(intargc,constchar*argv[]){@autoreleasepool{//块声明(没有传参,没有返回值)void(^internalBlock)(void);//局部静态变量staticintlocalStaticInt=20;//局部变量:localvariable(自由变量:freevariable)intlocalInt=20;//第一部分:将block对象最为函数的参数,在函数内部调用block//块定义(打印上面三个变量的值);internalBlock=^(void){printf("全局变量globalNumber:%d;局部静态变量localStaticInt:%d;局部变量localInt:%d\n",globalNumber,localStaticInt,localInt);};//将internalBlock块对象作为function的参数,调用function函数function(1,internalBlock);//第二部分:修改上述三个变量的值,重新调用function函数globalNumber=3000;localStaticInt=0;localInt=0;function(2,internalBlock);//第三部分:重新再写一次block的定义部分,再调用function函数internalBlock=^(void){printf("全局变量globalNumber:%d;局部静态变量localStaticInt:%d;局部变量localInt:%d\n",globalNumber,localStaticInt,localInt);};function(3,internalBlock);//第四部分:考察__block类型修饰问题__blockintlocalAnotherInt=20;void(^firstBlock)(void)=^(void){globalNumber+=100;localStaticInt+=200;localAnotherInt=10;printf("重新赋值后的globalNumber:%d;localStaticInt:%d;localAnotherInt:%d\n\n",globalNumber,localStaticInt,localAnotherInt);};//调用/执行firstBlockfirstBlock();}return0;}
分析:
初始化:全局:1000; 局部静态:20; 局部变量:20
a. function(1, internalBlock); 包除了包含可执行的代码,还包含可访问的变量的值(全局:1000; 局部静态:20; 局部变量:20)
b. globalNumber = 3000;
localStaticInt = 0;
localInt = 0;
function(2, internalBlock);
包除了包含可执行的代码,还包含可访问的变量的值(全局:3000; 局部静态:0; 局部变量:20);原因是block体内对局部变量没有修改的权限,还是原来第一次执行的包的数据
c. 重新再定义internalBlock块对象, 此时包内就重新包含了新的值(全局:1000; 局部静态:0; 局部变量:0)
internalBlock = ^(void) { printf("全局变量globalNumber:%d; 局部静态变量localStaticInt:%d; 局部变量localInt:%d\n", globalNumber, localStaticInt, localInt); };
function(3, internalBlock);
d.如果把局部的变量的类型添加__block类型,可以在block体中修改局部变量的值(重新赋值后的globalNumber:3100;localStaticInt:200; localAnotherInt:10)
问题三:Block体循环应用的问题,如何解决(考察__weak类型)
TRBlockObject*blockObj=[TRBlockObjectnew];blockObj.block=^void(void){NSLog(@"blockObj%@“,blockObj);};
例子中,block属性是blockObj对象的;而在block体中,block又引用了blockObj对象,造成了循环引用。
解决的办法是:
TRBlockObject*blockObj=[TRBlockObjectnew];//解决循环引用的方案使用__weak修饰符。__weakTRBlockObject*weakBlockObj=blockObj;blockObj.block=^void(void){NSLog(@"blockObj%@",weakBlockObj);};
__weak是弱引用,blockObj被释放的时候,weakBlockObj已经是nil了。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。