1、block的聲明
void(^block)();
2、block的三種定義
三種方式 = ^(參數(shù)){
}
a.void(^block1)() = ^(){
}
//如果沒(méi)有參數(shù) 參數(shù)可以隱藏。如果有參數(shù),定義的時(shí)候,必須要寫(xiě)參數(shù),而且必須要有參數(shù)變量名
b.
void(^block2)() = ^{
}
void(^block2)(int) = ^(int a) {
}
//bock返回值可以省略,不管有沒(méi)有返回值都可以省略
c.int(^block3)() = ^int{
return 3;
}
3、bolck的用處
a. 封裝模型方法
b.傳值
傳值
只要能拿到對(duì)方就能傳值
順傳:給需要傳值的對(duì)象,直接定義屬性就能傳值
逆?zhèn)鳎河么?,block
4、block的存儲(chǔ)
只要block沒(méi)有引用外部局部變量,block放在全局區(qū)。
MRC管理block:
只要block引用外部局部變量,block就放在棧區(qū)。
block只能使用copy,不能使用retain,使用retain,block還在棧里面。
ARC管理block:
只要arc引用外部局部變量,block放在堆里面。
block使用strong,盡量不要用copy。
5、block會(huì)造成循環(huán)引用
block會(huì)對(duì)里面所有強(qiáng)指針變量都強(qiáng)引用一次。
6、其他
a.如果是局部變量,block是值傳遞。
int a = 3;
void (^block)() = ^{
NSLog(@"%d",a);
}
a = 5;
block();
//打印輸出a = 5
b.如果是靜態(tài)變量,block是指針傳遞```
static int a = 3;
void (^block)() = ^{
NSLog(@"%d",a);
}
a = 5;
block();
//打印輸出a = 3
c.如果是全局變量,_ _block修飾的變量,block是指針傳遞