Object c block需要注意的幾點問題

2021-09-07 04:05:47 字數 1952 閱讀 3641

摘自:

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實現的框架頁面,其中的頁面有時...