美文网首页大神ios
关于block的记录

关于block的记录

作者: 石丘 | 来源:发表于2015-07-31 18:03 被阅读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在栈上,还是堆上

    相关文章

      网友评论

        本文标题:关于block的记录

        本文链接:https://www.haomeiwen.com/subject/tlfvqttx.html