做了大半年IOS,每次想写block的时候都发现不记得格式,总要翻一翻老代码然后copy一份,然而并不能记住,恶性循环影响工作效率。
参考:https://www.jianshu.com/p/e82bc3acc2c9 记录一下block的基本用法,目标是流利的写出一个个block。
原型声明和定义
NSString *(^myBlock)(int);
原型声明分三部分,格式可以总结为:
返回类型(^block名)(参数类型 [参数名可选]);
个人比较常使用的场景为属性声明,比如:
@property(nonatomic, copy)void(^dismissBlock)(void);
@property(nonatomic, copy)void(^dismissBlock2)(UIView *view);
block定义的基本使用:
void (^logBlock)(NSString *)=^(NSString *paramStr){
};
定义的格式:
^(参数类型 [参数名 可选]){
[return 返回值 可选]
};
稍微延伸记录一下(属性关键字也是很不熟悉的一点)
属性copy关键字是深拷贝:
1.这个属性被赋值的时候,都会转换成不可变的类型;
2.拷贝对象的时候需要重写copyWithZone:方法。
作为方法参数
在方法声明中:
- (void)getMyBlock:(void(^)(int aa,int bb))myBlock;
格式:
- (方法返回类型)方法名:(返回类型(^)(参数类型 [参数名 可选]))block名 方法名:其他参数;
在方法定义中:
- (void)getMyBlock:(void(^)(int aa,int bb))myBlock
{
}
格式和声明相同
在方法调用中:
[self getMyBlock:^(int aa,int bb){
}];
格式:
[方法调用对象 方法名:其他参数 方法名:^(参数类型 [参数名 可选]){
[return 返回值 可选]
}];
重命名
主要目的是方便代码阅读,记录一下代码语法
typedef 返回类型(^block名)(参数类型 [参数名可选]);
一般会这样用,简化作为原型声明和作为方法参数时的语法:
typedef void(^MyBlock)(void);
@property(nonatomic, copy) MyBlock myBlock;
-(void)method:(MyBlock)myblock;
-(void)method:(MyBlock)mybloc
{
};