长路漫漫,唯剑作伴--block
一、简介
- block作为OC中经常使用的代码块,现在在越来越多的地方被使用。她类似于函数,又比函数更灵活。函数在编译前就已经确定了,但是block的代码块确是不确定的,block还有个特点就是可以作为方法的参数被使用,可以跨页面传值,在实际开发中,充当了很多代理的功能。
二、block的使用
-
一个简单的block
int (^blockName)(int ,int) = ^(int a, int b){ return a + b; }; blockName(2, 3);
-
简单的使用
// 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]; }
三、注意事项
-
__block和__weak
- __block是用来修饰一个变量,这个变量就可以在block中被修改
- 使用__block修饰的变量在block代码快中会被retain
- 使用__weak修饰的变量不会在block代码块中被retain
- 要避免block出现循环引用 __weak typedof(self)weakSelf = self
-
block为什么要用copy修饰
- block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。
- 如果使用weak或者assign修饰,在block的作用域之外调用block将会导致崩溃。
- 属性声明为strong也是可以的,系统底层会对block进行一次copy操作。只不过copy操作效率更高。
-
__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以後的版本
-