^
是block的特有标记。(返回类型)(^block名称)(参数类型)=^(参数列表){代码实现};。
说明:如果没有参数,等号后面参数列表的()可以省略。
- (void)viewDidLoad { [super viewDidLoad]; //1、无参数、无返回值的block的定义和使用 void (^myBlock1)() = ^{ NSLog(@"block无返回值,无参数"); }; myBlock1(); //2、无参数、有返回值的block的定义和使用 int (^myBlock2)() = ^{ return 10; }; NSLog(@"myBlock2的返回值是%d", myBlock2()); //3、有参数,有返回值的block定义和使用 int (^myBlock3)(int, int) = ^(int a, int b) { return a + b; }; NSLog(@"myBlock3的返回值是%d", myBlock3(5, 8)); }
运行结果:
2. block作为方法的参数
将block作为方法的参数,可以用block来封装代码块。
- (void)viewDidLoad { [super viewDidLoad]; //1、无参数、无返回值的block的定义和使用 void (^myBlock1)() = ^{ NSLog(@"block无返回值,无参数"); }; myBlock1(); //2、无参数、有返回值的block的定义和使用 int (^myBlock2)() = ^{ return 10; }; NSLog(@"myBlock2的返回值是%d", myBlock2()); //3、有参数,有返回值的block定义和使用 int (^myBlock3)(int, int) = ^(int a, int b) { return a + b; }; NSLog(@"myBlock3的返回值是%d", myBlock3(5, 8)); //4、作为方法的参数,可以用block来封装代码块。 [self testBlockAsParam:^{ NSLog(@"block作为testBlockAsParam的参数"); }]; } - (void) testBlockAsParam: (void (^)()) block { block(); //执行block内部代码 }
运行结果:
3. Block作为属性
block作为属性,应使用copy修饰。若用weak、assign修饰block属性时,当block所在函数\方法返回\结束,该block就会被销毁。在其他方法内部调用访问该block,就会引发野指针错误EXC_BAD_ACCESS
。
#import "ViewController.h" @interface ViewController () @property (nonatomic,copy) void (^myBlock)(); //block作为属性 @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //1、无参数、无返回值的block的定义和使用 void (^myBlock1)() = ^{ NSLog(@"block无返回值,无参数"); }; myBlock1(); //2、无参数、有返回值的block的定义和使用 int (^myBlock2)() = ^{ return 10; }; NSLog(@"myBlock2的返回值是%d", myBlock2()); //3、有参数,有返回值的block定义和使用 int (^myBlock3)(int, int) = ^(int a, int b) { return a + b; }; NSLog(@"myBlock3的返回值是%d", myBlock3(5, 8)); //4、block作为方法的参数,可以用来封装代码块。 [self testBlockAsParam:^{ NSLog(@"block作为testBlockAsParam的参数"); }]; //5、block作为属性 [self setMyBlock:^{ NSLog(@"block作为属性"); }]; NSLog(@"%@",self.myBlock); self.myBlock();//block作为属性的调用 } - (void) testBlockAsParam: (void (^)()) block { block(); //执行block内部代码 }
运行结果:
原文:http://www.cnblogs.com/jxufelilu-blog/p/5008016.html