塊(Block)分為三類:
- 棧塊
- 堆塊
- 全局塊
1. 棧block
定義塊的時(shí)候泥技,其所占內(nèi)存區(qū)域是分配在棧中的,而且只在定義它的那個(gè)范圍內(nèi)有效:
void (^block)();
if ( /* some condition */ ) {
block = ^{
NSLog(@"Block A");
};
} else {
block = ^{
NSLog(@"Block B");
};
}
block();
上面定義的兩個(gè)塊只在if else語(yǔ)句范圍內(nèi)有效面哥,一旦離開(kāi)了最后一個(gè)右括號(hào),如果編譯器覆寫(xiě)了分配給塊的內(nèi)存,那么就會(huì)造成程序崩潰
2. 堆block
為了解決這個(gè)問(wèn)題呆躲,我們可以給對(duì)象發(fā)送copy消息捣卤,復(fù)制一份到堆里忍抽,并自帶引用計(jì)數(shù):
void (^block)();
if ( /* some condition */ ) {
block = [^{
NSLog(@"Block A");
} copy];
} else {
block = [^{
NSLog(@"Block B");
} copy];
}
block();
3. 全局block
全局塊聲明在全局內(nèi)存里,而不需要在每次用到的時(shí)候于棧中創(chuàng)建董朝。
void (^block)() = ^{
NSLog(@"This is a block");
};