block的作用

ios高效开发--blocks相关

1、替换delegate

如果我们有2个viewController,a和b,当我们从a界面push到b后,在b上面触发了一些事件,这些时间又会影响到a界面上的内容。

 
   

上面是2个界面,当我们点击b界面的按钮3的时候,希望a界面上文字也相应的改变了

一般情况下我们会用delegate来实现。

代理很强大,不过代理它是程序的事件逻辑也变的复杂了。

来看下用block怎么处理。

一个block语句的定义类似于C的函数,有返回值,有0到多个参数,接下来属性声明,跟一般的属性声明差不多:


1 typedef void (^CallBack)(int index);
2
3 @property(nonatomic, copy)CallBack callBack;

然后在b里面触发按钮事件的时候调用block,调用前最好先检查下是否为nil


 1 - (IBAction)click2:(id)sender
2 {
3 if(self.callBack)
4 self.callBack(2);
5 }
6
7
8 - (IBAction)click3:(id)sender
9 {
10 if(self.callBack)
11 self.callBack(3);
12 }

现在完成了调用,具体的实现在哪呢,我们回到a当中,在a中执行跳转界面的地方,加上相关的实现。


1     SecondViewController *secondController = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
2
3 secondController.callBack = ^(int index)
4 {
5 self.clickBtnLabel.text = [NSString stringWithFormat:@"click %d", index];
6 };
7
8 [self.navigationController pushViewController:secondController animated:YES];

在是用block的时候,要注意所有权的问题,要小心产生循环,那样会导致资源无法释放。

例如在block中使用了一个指针,恰巧这个指针又是block的拥有者,那么会产生一个循环引用,他们都是强引用,无法释放。为了避免产生类似的问题,就需要用__weak标记block的拥有者。delegate和block在上面时候是用,要看具体情况,如果一个类的delegate里有很多方法,那还是放在delegate里实现吧。

2、系统定义的block

ios当中还有大量系统已经定义好的block,使用这些block实现特定的一些功能,能是整体代码更加简洁和高效。

例如遍历字典的时候,ios就提供了:


- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block;

简单举个例子,我们要在字典中根据key来查找某个value,然后把value记录下来。


 1     NSArray *keyArray = @[@"aa", @"ddd", @"cc", @"bb", @"ww", @"111"];
2 NSArray *valueArray = @[@"apple", @"ios", @"mac", @"xcode", @"view", @"array"];
3 NSDictionary *enumDict = [NSDictionary dictionaryWithObjects:valueArray forKeys:keyArray];
4 __block NSString *valueString = nil;
5 [enumDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
6 if([key isEqualToString:@"bb"])
7 {
8 valueString = obj;
9 *stop = YES;
10 }
11 }];

整个过程变的简单了。

还有在实现UIView动画的时候,block能让我们更加简单高效的实现很多特效。


1     [UIView animateWithDuration:0.5 animations:^{
2 animateView.alpha = 0.0;
3 } completion:^(BOOL finished) {
4 animateView.alpha = 1.0;
5 }];

这段代码实现了view透明度从1.0变到完全透明,用时0.5秒,当动画结束后重新显示view。

block的作用,布布扣,bubuko.com

时间: 2024-11-14 02:12:22

block的作用的相关文章

a 的display:block 的作用

display:block即是块级元素 display:inline即是内联元素 块状元素默认是占据一行的位置,下一个元素将被迫挤到下一行显示.内联元素则不是,它会使得下一个元素自动贴到自己的有边显示. 内联元素有: a, abbr, acronym, b, bdo, big, br, button, cite, code, dfn, em, i, img, input, kbd, label, map, object, q, samp, script, select, small, span,

32-oc block

Block基本概念 学习的时候注意和指向函数的指针对比学习 什么是Block Block是iOS中一种比较特殊的数据类型,用来保存某一段代码 Block的作用 Block用来保存某一段代码, 可以在恰当的时间再取出来调用功能类似于函数和方法 问题3:Block的格式 答: Block的格式: 返回值类型 (^block变量名)(形参列表) = ^(形参列表) { }; Block和typedef 怎么使用tydedef给 block 起别名?注意和指向函数的指针进行对比 利用typedef给bl

OC中的Block数据类型和protocol

Block数据类型 作用:封装一段代码,可以再任何地方执行. 定义格式:返回值类型 (^变量名)(传入的形参的数据类型) = ^(传入代码块的参数){代码块}; 调用方法:变量名(实参): block其实与函数差不多,他们的相同之处有: 1.都可以保存代码 2.都可以有返回值 3.都有形参和实参 4.调用方式一样 使用注意: 1.Block内部可以访问外面的成员变量 2.默认情况下,Block内部不能修改外面的局部变量 3.如果一定要在Block内部修改外面的局部变量,可以再该局部变量前加__b

obj-c8[block语法]

Block语法  块语法,本质上是匿名函数(没有名称的函数)C++.JS.Swift等语言,有类似语法,叫做闭包 //Block 的作用,主要是用于回调函数,解耦合 //当方法的参数是block类型,block的参数用户从内向外传值;block的返回值,用于,从外向内返回结果 #import <Foundation/Foundation.h> #import "XunleiDownload.h" #import "LoginManager.h" #imp

黑马程序员—oc语言学习心得—block

黑马程序员—oc语言学习心得—block -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,程序一般用typedef定义一个block类型 然后调用 typedef void(^xxx)(); 可使用助记符 inlineblock 2,Block内部可以访问外部变量:默认情况下,Block内部不能修改外部的局部变量 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改. 3,block的作用: 利用block封

简述block

block传值也适用于从后往前传值 先介绍block的基本知识 /** * 1.如何定义一个Block变量 2.怎样给定义的Block变量赋初值 3.如何冲定义Block类型 4.如何使用Block实现具体的佛那个能 5.Block与变量作用域的关系 */ int sum(int a, int b) { return a + b; } int count = 100; int main(int argc, const char * argv[]) { /** * 1.Block是一种数据类型,并

OC基础--ARC Category Block

autorelease 什么是自动释放池? autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次release操作 自动释放池的优点是什么? 1.不用再担心对象释放的时间 2.不用再关心什么时候添加release 自动释放池的原理? autorelease实际上只是把对release的调用延迟了,对于每一个autorelease,系统只是把该对象放入了当前的autor

(译)IOS block编程指南 2 block开始

Getting Started with Blocks(开始block) The following sections help you to get started with blocks using practical examples. 接下来这一节有实用的例子帮你开始blocks. Declaring and Using a Block (定义和使用block) You use the ^ operator to declare a block variable and to indic

译:go’s block and identifiers scope

go 代码块和标识符作用域 (go's  block and identifiersscope) 一.      Blocks A block is a possibly empty sequence of declarations andstatements within matching brace brackets. 语句块(blocks)由闭合的大括号包裹,里面可能包含空的声明或者语句:block与作用域密切相关,见下章节. Block = "{" StatementList