您好,登錄后才能下訂單哦!
問題一: block對象的生命周期?
直接看代碼,打印結果是什么?
#import <Foundation/Foundation.h> //定義block對象(全局block) int (^externBlock)(void) = ^(void){return 100;}; //定義函數(block做為參數) void function(int (^block)(void)) { printf("執行block的結果是:%d\n\n", block()); } //定義的兩個函數 void firstFunc(int number) { //定義塊對象(局部) int (^blockWithinFirst)(void) = ^(void) { return number; }; //調用外部的function函數 function(blockWithinFirst); //賦值 externBlock = blockWithinFirst; } void secondFunc(int number) { //int局部變量 int index = 10; //block局部對象 int (^blockWithinSecond)(void) = ^(void) {return number * index;}; //調用外部function函數 function(blockWithinSecond); } int main(int argc, const char * argv[]) { @autoreleasepool { //1.調用function函數 function(externBlock); //2.調用firstFunc firstFunc(5); //3.調用secondFunc secondFunc(10); //4.和步驟1一樣 function(externBlock); } return 0; }
問題二:Block體中訪問全局變量/局部靜態變量/局部變量的問題,如何解決(考察__block類型)
#import <Foundation/Foundation.h> void function(int number, void (^blockParam)(void)) { //打印傳入的number值 printf("傳入的number是: %d\n", number); //調用傳入的block對象 blockParam(); } int globalNumber = 1000;//全局變量(外部變量) int main(int argc, const char * argv[]) { @autoreleasepool { //塊聲明(沒有傳參,沒有返回值) void (^internalBlock)(void); //局部靜態變量 static int localStaticInt = 20; //局部變量:local variable(自由變量:free variable) int localInt = 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類型修飾問題 __block int localAnotherInt = 20; void (^firstBlock)(void) = ^(void) { globalNumber += 100; localStaticInt += 200; localAnotherInt = 10; printf("重新賦值后的globalNumber:%d;localStaticInt:%d; localAnotherInt:%d\n\n", globalNumber, localStaticInt,localAnotherInt); }; //調用/執行firstBlock firstBlock(); } return 0; }
分析:
初始化:全局: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 = [TRBlockObject new]; blockObj.block = ^void(void){ NSLog(@"blockObj%@“,blockObj); };
例子中,block屬性是blockObj對象的;而在block體中,block又引用了blockObj對象,造成了循環引用。
解決的辦法是:
TRBlockObject *blockObj = [TRBlockObject new]; //解決循環引用的方案使用__weak修飾符。 __weak TRBlockObject *weakBlockObj = blockObj; blockObj.block = ^void(void){ NSLog(@"blockObj%@",weakBlockObj); };
__weak是弱引用,blockObj被釋放的時候,weakBlockObj已經是nil了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。