大神ios

关于block的记录

2015-07-31  本文已影响85人  石丘

认识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

尾记:感谢麻友三万等童鞋提供的支持😄


W0CYUJT51S%{SVA@F41KAG9.jpg 9MFG`JOD3W$_`4SP(UIIED2.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就行了

黑幕背后的__block修饰符
内存管理——如何验证block在栈上,还是堆上

上一篇 下一篇

猜你喜欢

热点阅读