认识block
block和函数很相似所以可以对比函数看一下 (不拿函数指针对比了看着晕)
带参数带返回值的例子 函数声明:
int sum (int a,int b) int (^sum) (int a,int b)
很明显基本一样的 就是多了一个block的标志^
然后把函数名括起来了
函数和block的对比
都是保存一段代码 用来执行
int main(){ //在函数中执行的时候就是一模一样的调用 sum(1,2);//函数 sum(1,2);//block }
不同的地方是保存代码块的书写方式是不同的
int sum (int a,int b){int s = a+b; return s;}
int (^sum)(int a,int b)=^(int a,int b){int s = a+b; return s;}
最重要的是 block是可以在函数内部保存代码块 函数只能在外面
block的书写
blcok的typedef比较特殊直接这么写一句就可以了:
typedef int (^Sum)(int, int); Sum sum;
然后就可以去定义这种类型的block了
sum =^(int a,int b){int s = a+b; return s;}
写的时候好看一点了 用的时候是一样的
sum(1,2);
block回调 block事先保存一段代码恰当的时候拿出来调用
__block int a = 10;
// 定义Block变量
void(^MyBlock)()=^{
NSLog(@"执行任务");
a=20;
};
// 调用Block内部代码
MyBlock();
//在执行一次
MyBlock();
1.在定义block的时候 如果引用了外部变量 会对外部变量做一个copy
记录住定义block的时变量的数值
如果后续再修改x的值 不会影响block内部的数值变化
2.如果要在block中 修改外部变量的数值 需要使用__block修饰符号
定义block时 如果外部使用__block的变量
block定义之后 外部变量的指针地址同样会变成堆区的地址
//inlineBlock
returnType(^blockName)(parameterTypes) = ^(parameters) {
statements
};
2.关于解决循环引用的问题
block被强引用而且block里面有强引用属性的时候会存在循环引用的问题
我们把block里面的强引用改成弱指针就可以了
_unsafe_unretained viewController*shre = self
__weak viewController*shre = self
__weak typeof(self) share = self
typedef void (^BoolBlock)(BOOL);
一个只接受一个BOOL参数,没有返回值的block
typedef int (^IntBlock)(void);
一个没有参数,返回int的block
typedef BoolBlock (^HugeBlock)(IntBlock);
看看,这个HugeBlock的参数和返回值都是block
3.下面是一个block应用例子
写一个带block的方法 并调用此方法
<code>
typedef void (^IsScuess) ();
@property (nonatomic, copy) IsScuess isScuess;
//写方法
-(void)addDeviceModel:(DeviceModel*)Model IsScuess:(IsScuess)isScuess{
[self.backView makeToastActivity];
isScuess();
}
//调用
[self addDeviceModel:model IsScuess:^{
if ([[DeviceDataManage sharedManager] addDeviceWithModel:model]) {
[share.backView hideToastActivity];
[share.backView makeToast:@"添加成功"];
}else{
[share.backView hideToastActivity];
[share.backView makeToast:@"设备重复"];
}}];</code>
然后对比下系统的带block的方法
+(void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
尾记:感谢麻友三万等童鞋提供的支持😄
![](https://img.haomeiwen.com/i301562/a32136b1393f8dc3.jpg)
![](https://img.haomeiwen.com/i301562/233bb8b1a3fcdf6d.jpg)
![@Z{07P]6E3VXC`P]N0N)NY5.jpg](http:https://img.haomeiwen.com/i301562/dc438862fd804179.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
![7NW1{44ZXYDF`NB@G7{@]3U.jpg](http:https://img.haomeiwen.com/i301562/881a98fa4bfb23d9.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
就是你 菊花 的地方价格 handler
然后结束的时候调用下handler就行了
网友评论