您的位置:首页 > 移动开发 > IOS开发

iOS block

2015-09-25 21:00 429 查看
主要内容:

block基本声明格式

block访问区域变量

block代替代理

block基本声明格式:

^(传入的参数){具体代码};

注: Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。

最简单的例子:

^(int a){return a*a};

简单调用例子:

int result = ^(int a){return a*a}(5);
NSLog(@"%d", result);
//好像这个例子没什么用,个人不知道这样写的意义在哪。

Block Pointer(Block指针)

//声明一个square的Block Pointer,其所指向的Block有一个int输入和int输出
int (^square)(int);
//将Block实体指定给square
square = ^(int a){ return a*a ; };
//调用方法,感觉是是不是很像function的用法?
int result = square(5);
NSLog(@"%d", result);

Block 还可以当作方法传给参数,如:

-(void)objcMethod:(int(^)(int))square;  //square参数的类型是int(^)(int)


存取变量:

在同一个代码块里面,Block是可以读取Block之外的变量的,如:

{
int outN = 8;
int (^myPtr)(int) = ^(int a){ return outN + a;};
//block里面可以读取同一类型的outN的值
int result = myPtr(3);  // result is 11
NSLog(@"result=%d", result);
}

当变量为简单类型时,Block是直接copy当前变量的,而不是引用,如:

{
int outN = 8;
int (^myPtr)(int) = ^(int a){ return outN + a;};
//block里面可以读取同一类型的outN的值
//改变outN 的值
outN = 5;
int result = myPtr(3);  // result is 11
NSLog(@"result=%d", result);
}

注:如果变量被static修饰过,会有一样的效果

当变量为指针时,如:

{
NSMutableString string = [[NSMutableString alloc]initWithString:@"aaaa"];
int (^myPtr)(int) = ^(int a){[string setString:@"changed!"] return a + a;};
//block里面可以读取同一类型的outN的值
int result = myPtr(3);  // result is 11
NSLog(@"string =%@", string);// string =changed
}

Block variable(Block类型变量)

在某个变量前面如果加上修饰字“__block”的话(注意,block前面有两个下划线),这个变量就称作block variable。

那么在block里面就可以任意修改此变量的值,如:

{
int outN = 8;
int (^myPtr)(int) = ^(int a){ return outN+= a;};
//block里面可以读取同一类型的outN的值
int result = myPtr(3);  // result is 11
NSLog(@"outN=%d", outN);  //outN=11
}


用Block代替代理

假如controller 的名字为: MyUIViewController

1).声明一个block(假设无返回值)

typedef void(^onSearch)(NSString *text);

2).在controller(事件触发源的地方)定义block

//定义成员属性
@property(nonatomic)onSearch onSearchBlock;
//添加setter方法
-(void)setOnSearchBlock:(void(^)(NSString *searchText)) block;

3).在对应的m文件里面实现setter方法

-(void)setOnSearchBlock:(void(^)(NSString *searchText)) block{
if (block) {
self.onSearchBlock = block;
}
}

4)在controller 中使用block实现回调,如:

-(void)searchHandler:(id)sender {
if (self.searchBlock) {
//这里传具体的参数,要查询的文本
self.searchBlock(@"your search keyword")
}
}

5)在其它地方,接收传过来的参数,如:

MyUIViewController *vc = [MyUIViewController new];
[vc setOnSearchBlock:^(NSString *searchText) {
NSLog(@"get search keyword")
}]

注: 如果需要在block 里面调用self,则需要用weak 修饰避免整个类循环copy.如: __weak typeof(self) wself = self;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: