ios之block
Block基本概念 Block是OC中的一种数据类型 是一个能工作的代码单元,可以在任何需要的时候被执行 本质上是轻量级的匿名函数,可以作为其他函数的参数或者返回值 块代码本身可能有一个参数列表,也可能有一个返回值 可以把块代码赋给一个变量,并在需要的时候调用,就像调用一个普通函数一样 块代码使用的注意事项 默认情况下,不允许在块代码内部修改外部变量的数值 __block 循环引用 __weak 格式说明: (返回类型)(^块名称)(参数类型列表) = ^(形参列表) {代码实现}; void (^myBlock)(int,int) = ^(int x , int y) { //代码实现 } //下面是Block的简单使用 #import <Foundation/Foundation.h> typedef double(^MyBlock)(double, double); MyBlock area = ^(double x, double y) { return x * y; }; int a = 0; static int b = 11; /** block的定义*/ void test1() { // block 定义,是准备好一段代码片段,在需要的时候执行 // block是C语言的格式 // 输入:inlineblock // 格式:返回类型 (^blockName) (参数类型) = ^(形参列表) { 代码实现 }; // 提示:如果没有参数,格式可以简化 // 格式:返回类型 (^blockName) () = ^ { 代码实现 }; void (^myBlock)() = ^{ NSLog(@"block的最简单定义"); }; //调用myblock myBlock(); //最全的定义 int (^block) (int , int , int) = ^(int x, int y, int z) { return x + y + z; }; int sum = 0; sum = block(10,19,20); NSLog(@"sum - %d",sum); } /** 外部访问变量,常见面试题1*/ void test2() { int x = 10; __block int y = 20; NSLog(@"x - %d , x - add - %p",x,&x); // 在定义block时,如果block中使用到外部的“局部”变量,block会建立该变量的副本(会记录当前x的数值) void (^block)() = ^{ /**********在使用局部变量时,默认不允许在块代码中直接修改局部变量的数值********/ // x = 20; /************全局变量可以在block中修改其值******************/ a = 10; /**********如果要在block中修改外部变量的值,需要使用 __block***************/ y = 30; NSLog(@"block - x = %d",x); NSLog(@"block - x = %p",&x); //默认存储是再栈中 }; block(); NSLog(@"最后的x = %d",x); } /** 外部访问变量,常见面试题2*/ void test3() { NSMutableString *str = [NSMutableString stringWithFormat:@"hello"]; NSLog(@"定义之前 - %p 定义之前 - %p", &str, str); void (^block)() = ^{ // 修改指针指向内存空间的内容 [str setString:@"水水水水"]; NSLog(@"block里面通过指针 - %p %@", &str, str); }; block(); } int main(int argc, const char * argv[]) { test3(); return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。