长路漫漫,唯剑作伴--block

一、简介

  • block作为OC中经常使用的代码块,现在在越来越多的地方被使用。她类似于函数,又比函数更灵活。函数在编译前就已经确定了,但是block的代码块确是不确定的,block还有个特点就是可以作为方法的参数被使用,可以跨页面传值,在实际开发中,充当了很多代理的功能。

二、block的使用

  1. 一个简单的block

    int (^blockName)(int ,int) = ^(int a, int b){
            return a + b;
        };
    blockName(2, 3);
  2. 简单的使用

    // ViewController2.h
    
    #import <UIKit/UIKit.h>
    
    typedef void (^returnColor) (UIColor *color);
    
    @interface ViewController2 : UIViewController
    
    @property (nonatomic, copy)returnColor returnColor;
    
    @end
    // ViewController2.m
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        self.returnColor([UIColor grayColor]);
        [self.navigationController popViewControllerAnimated:YES];
    }
    // Viewcontroller.m
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        ViewController2 *two = [[ViewController2 alloc] init];
        two.returnColor = ^(UIColor *color){
            self.view.backgroundColor = color;
        };
        [self.navigationController pushViewController:two animated:YES];
    }

三、注意事项

  1. __block和__weak

    • __block是用来修饰一个变量,这个变量就可以在block中被修改
    • 使用__block修饰的变量在block代码快中会被retain
    • 使用__weak修饰的变量不会在block代码块中被retain
    • 要避免block出现循环引用 __weak typedof(self)weakSelf = self
  2. block为什么要用copy修饰

    • block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。
    • 如果使用weak或者assign修饰,在block的作用域之外调用block将会导致崩溃。
    • 属性声明为strong也是可以的,系统底层会对block进行一次copy操作。只不过copy操作效率更高。
  3. __block在arc和非arc下含义一样吗?

    • __block在mrc下是不会被retain的
    • __block在arc下是会被retain的,取而代之的是用__weak或是__unsafe_unretained來更精確的描述weak reference的目的
      __block MyClass* temp = …;    // MRC環境下使用
       __weak MyClass* temp = …;    // ARC但只支援iOS5.0以上的版本
       __unsafe_retained MyClass* temp = …;  //ARC且可以相容4.x以後的版本

       

    •  

       

 

posted @ 2017-03-09 01:21  来事啊  阅读(190)  评论(0编辑  收藏  举报