Objetive-C學習_Block學習筆記,objetive-c_block
Block : 帶有自動變數(局部變數)的匿名函數。
Block作用 : 用來儲存一段代碼,可以在適當的時候調用
Block實質 : 結構體,其裡面有一個函數指標
Block應用情境 : 動畫、多線程、集合遍曆、網路請求回調
Block格式 : ^傳回值類型 參數列表 {運算式} (如果傳回值類型為void和參數列表為空白時是可以省略不寫的)
Block與函數的對比 :
聲明 函數類型 : int ( * funcptr )(int);
聲明Block類型 : int (^ blk)(int);
函數使用typedef : typedef int (^blk_t) (int);使用的時候就直接使用blk_t
Block使用typedef : typedef int (* funcptr) (int);賦值的時候是用函數的地址funcptr func = &addTen;
例子 blk_t blt = ^int (int a){//傳回值一般不寫,參數列表是要有()
return 4;
};
截取自動變數值 : Block截獲所使用的自動變數的值,不使用的是不會截獲的。即儲存該自動變數的瞬時值,在執行Block的文法後,即使改寫Block中使用的自動變數的值也不會影響Block執行時自動變數的值。
代碼 :
(1)int a = 10;
blk_t block = ^ {
NSLog(@"%d",a);
};
a = 100;
block();//列印之後的結果是10而不是100
(2)Person * p = [[Person alloc]init];
p.name = @"張三";
blk_t block = ^ {
//擷取的是地址,並不是對象的本身
NSLog(@"%@",p.name);
[p1 release];
};
p.name = @"李四";
[p release];
p = nil;
block();
} // [Person name]: message sent to deallocated instance 0x100300170
知識點和注意點 :
(1) 預設情況下,block不能修改外面的局部變數(基礎資料型別 (Elementary Data Type)),除非在前面加__Block
(2) Block文法運算式中使用的局部變數被作為成員變數追加到Block所在的結構體中
(3) Block可以作為函數的參數,調用Block之前一定要判斷,Block可以為nil
(4) 使用Block的時候最好使用typedef
(5) 如果擷取的是引用的話,是可以修改對象的屬性的,不要加__Block也是可以修改的
(6) 在block中使用retain好像沒有效果,但是使用release是可以的