iOS中Block介紹(一)基礎

2021-09-07 03:51:04 字數 1599 閱讀 7892

ios開發block的使用指南,以及深入理解block的記憶體管理,也適用於osx開發。討論範圍:block的使用,記憶體管理,內部實現。不包含的內容:gc arc下的block記憶體,block在c++中的使用。

block是c級別的語法和執行時特性。block比較類似c函式,但是block比之c函式,其靈活性體現在棧記憶體、堆記憶體的引用,我們甚至可以將乙個block作為引數傳給其他的函式或者block。

先看乙個比較簡單的block例子:

int multiplier = 7; 

int (^myblock)(int) = ^(int num) ; 

在這個例子中,myblock是乙個block變數,它接受乙個int型別的引數,返回乙個int型別的值。是不是很像c函式?

來,讓我們typedef一下

typedef void (^boolblock)(bool);//乙個只接受乙個bool引數,沒有返回值的block 

typedef int (^intblock)(void);//乙個沒有引數,返回int的block 

typedef boolblock (^hugeblock)(intblock);//看看,這個hugeblock的引數和返回值都是block 

注意:上面的typedef都還有效~

主動呼叫一下:

- (void)somemethod 

; ablock(); 

}作為引數返回:

typedef void (^boolblock)(bool); 

- (boolblock)foo() 

; return [[ablock copy] autorelease];//一定要copy,將其複製到堆上,更詳細的原理,將在後續章節講解 

}類的乙個成員:

@inte***ce obj1 : nsobject 

@property (nonatomic, copy)boolblock block;//理由同上啊,同學們 

@end 

obj1 *obj1 = ... 

obj1.block = ^(bool bvalue) ; 

其他函式的引數:

- (void)foo(boolblock block)  } 

甚至其他block的引數:

boolblock bblock = ^(bool bv)}; 

hugeblock hblock = ^(boolblock bb) ; 

hbolck(bblock); 

啊,全域性變數!:

static int(^maxintblock)(int, int) = ^(int a, int b); 

int main() 

好了,你知道block大概能怎麼用了。

如果要在block內修改block外宣告的棧變數,那麼一定要對該變數加__block標記:

int main() 

}; }  好了,基礎很快,更詳細的內容將用來介紹深入的東西。

iOS中Block介紹(一)基礎

block是c級別的語法和執行時特性。block比較類似c函式,但是block比之c函式,其靈活性體現在棧記憶體 堆記憶體的引用,我們甚至可以將乙個block作為引數傳給其他的函式或者block。先看乙個比較簡單的block例子 int multiplier 7 int myblock int in...

Block介紹(一)基礎

block是c級別的語法和執行時特性。block比較類似c函式,但是block比之c函式,其靈活性體現在棧記憶體 堆記憶體的引用,我們甚至可以將乙個block作為引數傳給其他的函式或者block。先看乙個比較簡單的block例子 int multiplier 7 int myblock int in...

iOS開發 block介紹

void viewdidload nslog 我在看電視 void chargemyiphone void void finishblock void void finishblock 第乙個void表示此block無返回值。為block type的標誌。第二個 void 表示這個block無引數。...