iOS中Block的基础用法

作者: HHHHHHHHHHD | 来源:发表于2015-10-22 19:05 被阅读57542次
    本文简介

    本章不会对Block做过多的实现研究。只是讲解基本的用法。纯粹基础知识。结合实际项目怎么去做举例。Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。

    Block简介

    Block是一种比较特殊的数据类型。它可以保存一段代码,在合适的时候取出来调用。

    Block的修饰

    ARC情况下
    1.如果用copy修饰Block,该Block就会存储在堆空间。则会对Block的内部对象进行强引用,导致循环引用。内存无法释放。
    解决方法:
    新建一个指针(__weak typeof(Target) weakTarget = Target )指向Block代码块里的对象,然后用weakTarget进行操作。就可以解决循环引用问题。

    2.如果用weak修饰Block,该Block就会存放在栈空间。不会出现循环引用问题。

    MRC情况下
    用copy修饰后,如果要在Block内部使用对象,则需要进行(__block typeof(Target) blockTarget = Target )处理。在Block里面用blockTarget进行操作。

    Block的定义格式

    返回值类型(^block变量名)(形参列表) = ^(形参列表) {
    };
    调用Block保存的代码
    block变量名(实参);

    默认情况下,Block内部不能修改外面的局部变量
    Block内部可以修改使用__block修饰的局部变量

    Block的模式

    1.无参数无返回值的Block
    2.有参数无返回值的Block
    3.有参数有返回值的Block

    Block简单用法举例

    无参数无返回值的Block

    /**
     *  无参数无返回值的Block
     */
    -(void)func1{
        /**
         *  void :就是无返回值
         *  emptyBlock:就是该block的名字
         *  ():这里相当于放参数。由于这里是无参数,所以就什么都不写
         */
        void (^emptyBlock)() = ^(){
            NSLog(@"无参数,无返回值的Block");
        };
        emptyBlock();
    }
    

    有参数无返回值的Block

    /**
         *  调用这个block进行两个参数相加
         *
         *  @param int 参数A
         *  @param int 参数B
         *
         *  @return 无返回值
         */
        void (^sumBlock)(int ,int ) = ^(int a,int b){
            NSLog(@"%d + %d = %d",a,b,a+b);
        };
        /**
         *  调用这个sumBlock的Block,得到的结果是20
         */
        sumBlock(10,10);
    

    有参数有返回值的Block

    /**
         *  有参数有返回值
         *
         *  @param NSString 字符串1
         *  @param NSString 字符串2
         *
         *  @return 返回拼接好的字符串3
         */    
        NSString* (^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){
            return [NSString stringWithFormat:@"%@%@",str1,str2];
        };
        //调用logBlock,输出的是 我是Block
        NSLog(@"%@", logBlock(@"我是",@"Block"));
    

    Block结合typedef使用

    自己定义一个Block类型,用定义的类型去创建Block,更加简单便捷。
    这里举例一个Block回调修改上一下界面的背景颜色。
    ViewController1 控制器1,ViewController2 控制器2
    控制器1跳转到控制器2,然后在控制器2触发事件回调修改控制器1的背景颜色为红色。

    ViewController2的实现

    #import <UIKit/UIKit.h>
    @interface ViewController2 : UIViewController
    /**
     *  定义了一个changeColor的Block。这个changeColor必须带一个参数,这个参数的类型必须为id类型的
     *  无返回值
     *  @param id
     */
    typedef void(^changeColor)(id);
    /**
     *  用上面定义的changeColor声明一个Block,声明的这个Block必须遵守声明的要求。
     */
    @property (nonatomic, copy) changeColor backgroundColor;
    @end
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        //声明一个颜色
        UIColor *color = [UIColor redColor];
        //用刚刚声明的那个Block去回调修改上一界面的背景色
        self.backgroundColor(color);
    }
    

    ViewController1的实现

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        ViewController2 *vc =[[ViewController2 alloc]init];
        // 回调修改颜色
        vc.backgroundColor = ^(UIColor *color){
            self.view.backgroundColor = color;
        };
        [self.navigationController pushViewController:vc animated:YES];
    }
    

    相关文章

      网友评论

      • HHHHHHHHHHD:是的 最后那个肯定会 我没有改。你们发现就可以了
      • silencerZiBo:self没有弱引用,最终会循环使用,造成内存泄漏
      • 总想写点东西的陌小默:这个入门讲解的很入门,回忆一下基本知识点,不过关于block内存的问题,还需自己在学习。
      • 89848af90932:最后为啥不__weakself 和上面说的矛盾的啊
      • 陨之希留leo:V1怎么实现跳转到V2??
      • 生产八哥:这里为什么没造成循环引用,用到了self,不就造成内存泄漏了吗?
      • 狂野的骚猪:很好啊,还有什么文章吗?
      • RiversMa:最后应该会循环引用
      • CoderChou:哥们可以啊,不当老师白费了,调理很清晰
      • johnmuu:写得很清晰 、易懂,希望能看到作者出深入版。 :smile:
        目前对block的认识和使用,也只是在页面2的block方法处理完数据后返回到页面1.
        希望能通过向作者学习,了解更多关于block的知识。 :sunglasses:
      • 我是小文:已关注,帅哥 可以写点更高深的吗? 比如说实际项目中运用到的
      • 子书不言:讲的挺好的
      • 火星的蝈蝈:很有用,谢谢作者
      • zhq1992:厉害
      • Tracy_ljs:蛮基础的 有空看看
      • mirrorzyb:支持
      • smallLabel:希望可以有更加深入的讲解
        HHHHHHHHHHD:@smallLabel 有。在下一篇。这篇只是基础的。😄
      • 易本正经的其名为坤:复议,可不可以再来一个高深点的,你讲的好好。
        HHHHHHHHHHD:@AdamYLK 😁下一篇就会深层次的。我后天写好了。
      • 悠哉日常大王:给大神刷波6666666
        HHHHHHHHHHD:@悠哉日常大王 我不是大神。我只是记录一些我自己知道的基础知识而已啦😂
      • 马爷:大神再来一点高深的block讲解怎么样
        马爷:@像孩子一样 求通知
        马爷:@像孩子一样 nice
        HHHHHHHHHHD:@马爷 😁不是大神。下一篇就是深入点的。😄尽请期待。

      本文标题:iOS中Block的基础用法

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