博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
block的作用
阅读量:6681 次
发布时间:2019-06-25

本文共 2235 字,大约阅读时间需要 7 分钟。

 
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。

 

转载于:https://www.cnblogs.com/yulang314/p/3708072.html

你可能感兴趣的文章
C#连接Excel示例代码和驱动
查看>>
彻底弄明白之java多线程中的volatile
查看>>
30幅非常漂亮的微距摄影作品欣赏
查看>>
6、关于ctemplate的一个例子
查看>>
Sql Server 锁资源模式详解
查看>>
标准电声系统测试
查看>>
SQLite移植手记
查看>>
volcanol_Linux_问题汇总系列
查看>>
Bing Maps开发扩展一:Oracle Spatial的空间数据渲染
查看>>
HTTP中Keep-Alive(长连接)的一些说明
查看>>
apache2.4.1+mysql5.5.21+php5.4.0安装实践(二)
查看>>
LintCode 最大正方形
查看>>
python三方库之requests-快速上手
查看>>
图像工具包VintaSoftImaging.NET SDK v8.5,新增独立web服务
查看>>
面试敲门砖
查看>>
python将日志导入数据库代码案例2
查看>>
ORA-12705: Cannot access NLS data files or invalid environment specified
查看>>
用 Python 脚本实现对 Linux 服务器的监控
查看>>
windows主机安装zabbix-agent
查看>>
VirtualEnv 和Pip 构建Python的虚拟工作环境
查看>>