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;
}
原文:http://www.cnblogs.com/ndyBlog/p/3958956.html