摘自:
date : 2015-12-4
1. block定義
1) 說明:
a. block是oc中的一種資料型別,在ios開發中被廣泛使用
b. ^是block的特有標記
c. block的實現**包含在{}之間
d. 大多情況下,以內聯inline函式的方式被定義和使用
e. block與c語言的函式指標有些相似,但使用起來更加靈活
2) 格式:
(返回型別)(^塊名稱)(引數型別) = ^(引數列表)
注:如果沒有引數,等號後面的引數列表可以刪除。
3)例子:
(void) (^myblock)(int, int) = ^(int a, int b)
2. block需要注意的問題
問題一:
block可以使用在定義之前宣告的區域性變數
int i = 10;
void(^myblock)() = ^;
i = 100;
myblock();
該段**的輸出結果為10.
注意:a. 在定義block時,會在block中建立當前區域性變數內容的副本(拷貝)
b. 後續再對該變數的數值進行修改,不會影響block中的數值
c. 如果需要在block中保持區域性變數的數值變化,需要使用__block關鍵字
d. 使用__block關鍵字後,同樣可以在block中修改該變數的數值
問題二:
block可以使用block之前的區域性變數,但是不能對其進行修改。
bool flag = no;
[array enumerateobjectsusingblock:^(id obj, nsuinteger idx, bool *stop)
}];
上述**編譯時,有語法錯誤。
注意:1. 預設情況下,block外部的變數,在block中是唯讀的。
2. 如果需要修改外表變數的值,需要在宣告變數時加上__block關鍵字。
問題三:
傳遞物件
nsstring *stopname = @"王五";
nsarray *array = @[@"張三", @"李四", @"王五", @"趙六"];
[array enumerateobjectsusingblock:^(id obj, nsuinteger idx, bool *stop)
}];注意:
為保證block中的**正常執行,在將stopname的指標傳遞給block時,block會自動對stopname的指標做強引用。
問題四:
迴圈引用
@property (nonatomic, strong) nsmutablearray *myblocks;
#pragma mark 將**改為呼叫self的方法
int(^sum)(int, int) = ^(int x, int y) ;
[self.myblocks addobject:sum];
#pragma mark 物件被釋放時自動呼叫
- (void)dealloc
注意:
1. 迴圈引用的結果就是物件無法被釋放。
2. 區域性變數預設都是強引用的,離開其所在的作用域之後就會被釋放。
3. 使用__weak關鍵字,可以將區域性變數宣告為弱引用
__weak demoobj *weakself = self;
在block中引用weakself,則block不會再對self做強引用
int(^sum)(int, int) = ^(int x, int y) ;
推薦:ios block常見的錯誤(一)
ios block常見的錯誤(二)——迴圈引用
ios block常見的錯誤(三)——併發程式設計的block引用
Object C Block的實現方式
摘自 date 2015 12 4 前言 我們可以把block當作乙個閉包函式,它可以訪問外部變數和區域性變數,但預設是不可以修改外部變數。你可以使用它來做 方法,比起使用 delegate 會更加直觀。順帶一提,蘋果很多的介面 api 都使用了block。一 block的基本定義 block的基本...
delphi中使用override需要注意的地方
在override時,如果override的是procedure,則加上關鍵字inherited 就會執行父類同名procedure的所有過程,然後再執行子類中特有的過程。如果override的是function則不會執行父類中同名function的內容。但是,可以通過下面的方法來執行父類的內容 例...
tomcat向weblogic移植需要注意的問題
1.在開發階段,對應用程式熱部署時,會丟擲classcastexception異常,這是因為類載入器的原因,因為在對程式熱部署會由不同的類載入器載入同乙個類,解決辦法 重啟weblogic或在console中web模組配置中對問題程式點選重新部署 2.用frameset實現的框架頁面,其中的頁面有時...