簡介:Block是C語言中的一種數(shù)據(jù)類型褥民,它是預先準備好的代碼盔憨,在需要的時候就直接執(zhí)行的。
作用:可以當做參數(shù)傳遞缨称,也可以當做返回值凝果,一般在實際開發(fā)中前者用的比較多。用法也較容易睦尽。
在多線程和網(wǎng)絡也使用得相當頻繁豆村,一般都是作為回調(diào)使用!
block的表現(xiàn)在內(nèi)存中位置
全局區(qū):如果block中沒有使用任何全局變量
棧區(qū):如果 block 中使用了外部變量
MRC 模式可以看到
ARC 模式骂删,系統(tǒng)會自動將 Block 復制到堆中
堆區(qū):將 block 設置給 copy 屬性
注意:雖然目前 ARC 編譯器在設置屬性時,已經(jīng)替程序員復制了 block四啰,但是定義 block時宁玫,仍然建議使用 copy 屬性
注意:
1.如果 block 中使用了外部變量,會對外部變量做一次 copy柑晒。
2.如果要在 block 內(nèi)部修改棧區(qū)變量欧瘪,需要使用 __block 修飾符,并且定義 block 之后匙赞,棧區(qū)變量的地址會變化為堆區(qū)地址佛掖。
3.默認情況下妖碉,不允許在block內(nèi)部修改外部變量的值
4.如果在一個控制器中使用block并且在這個block里面使用了這個類對象(self),那么一定要在外部將類對象定義成弱指針類型芥被,這就能夠避免循環(huán)引用欧宜,內(nèi)存泄露的問題。
例:
//將block當做參數(shù)傳遞- (void)blockDemoWithblock:(void(^)(NSString *))myBlock{
myBlock(@"你好嗎拴魄?冗茸?");//傳入?yún)?shù)}//將block當做返回值值- (void(^)(NSString *))demo{void(^block)(NSString *) = ^(NSString *str){
NSLog(@"%@----我很好啊Fブ小夏漱!",str);
};returnblock;
}- (void)viewDidLoad {
[super viewDidLoad];//Do any additional setup after loading the view, typically from a nib.[self blockDemoWithblock:^(NSString *string) {
NSLog(@"%@",string);
}];
[self blockDemoWithblock:[self demo]];
}