1.block聲明
返回類型(^block名字)(參數(shù)列表)
int(^MyBlock)(int a,int b);
2.block賦值
block變量=^(參數(shù)類型){函數(shù)體};
MyBlock = ^(int a,int b){
return a+b;
};
3.聲明時(shí)同時(shí)賦值
int(^SomeBlock)(inta,intb) = ^(inta ,intb)
{
returna+b;
};
4.block變量的調(diào)用
SomeBlock(6,7);
int b = MyBlock(3,4);
使用typedef定義block
typedef void(^defBlock)(id some);
@property(nonatomic,copy) defBlock myDefBlock;
使用
_myDefBlock= ^(idsome){
NSLog(@"%@",some);
};
_myDefBlock(@"hehehe");
5.block作為函數(shù)參數(shù)
- (void)viewDidLoad {
[superviewDidLoad];
void(^block)(inta)=^(inta){
NSLog(@"%d",a);
};
[selfsomeBlockMethod:block];
}
-(void)someBlockMethod:(void(^)(inta))Myblock
{
Myblock(5);
}
或者[selfsomeBlockMethod:^(inta){
NSLog(@"%d",a);
}];
block的各種變量
Block內(nèi)訪問(wèn)局部變量
局部變量不改變值亩码,那就是傳值進(jìn)去
局部變量block里面改變值了十艾,得用__block聲明派近,傳的是指針進(jìn)去
Block內(nèi)訪問(wèn)全局變量
全局變量所占用的內(nèi)存只有一份,供所有函數(shù)共同調(diào)用,在Block定義時(shí)并未將全局變量的值或者指針傳給Block變量所指向的結(jié)構(gòu)體,因此在調(diào)用Block之前對(duì)局部變量進(jìn)行修改會(huì)影響B(tài)lock內(nèi)部的值,同時(shí)內(nèi)部的值也是可以修改的
Block內(nèi)訪問(wèn)靜態(tài)變量
在Block定義時(shí)便是將靜態(tài)變量的指針傳給Block變量所指向的結(jié)構(gòu)體,因此在調(diào)用Block之前對(duì)靜態(tài)變量進(jìn)行修改會(huì)影響B(tài)lock內(nèi)部的值,同時(shí)內(nèi)部的值也是可以修改的
Block在ARC下的內(nèi)存管理的官方案例
MyViewController *myController = [[MyViewController alloc] init];// ...__weakMyViewController *weakMyController = myController;myController.completionHandler =? ^(NSIntegerresult) {? ? MyViewController *strongMyController = weakMyController;if(strongMyController)? ? {? ? ? ? [strongMyController dismissViewControllerAnimated:YEScompletion:nil];? ? }else{// Probably nothing...}};[selfpresentViewController:myController animated:YEScompletion:^{}];
__weak雖然解決了循環(huán)引用,但是也容易涉及到另一個(gè)問(wèn)題,因?yàn)锽lock是通過(guò)弱引用指向了myController對(duì)象,那么有可能在調(diào)用Block之前myController對(duì)象便已經(jīng)被釋放了,所以我們需要在Block內(nèi)部再定義一個(gè)強(qiáng)指針來(lái)指向myController對(duì)象