1、替换delegate
 
    如果我们有2个viewController,a和b,当我们从a界面push到b后,在b上面触发了一些事件,这些时间又会影响到a界面上的内容。
              
上面是2个界面,当我们点击b界面的按钮3的时候,希望a界面上文字也相应的改变了
   
 
一般情况下我们会用delegate来实现。
代理很强大,不过代理它是程序的事件逻辑也变的复杂了。
 
来看下用block怎么处理。
 一个block语句的定义类似于C的函数,有返回值,有0到多个参数,接下来属性声明,跟一般的属性声明差不多: 
 typedef void (^CallBack)(int index);

 @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中执行跳转界面的地方,加上相关的实现。

     SecondViewController *secondController = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];

     secondController.callBack = ^(int index)
{
self.clickBtnLabel.text = [NSString stringWithFormat:@"click %d", index];
}; [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记录下来。

     NSArray *keyArray = @[@"aa", @"ddd", @"cc", @"bb", @"ww", @""];
NSArray *valueArray = @[@"apple", @"ios", @"mac", @"xcode", @"view", @"array"];
NSDictionary *enumDict = [NSDictionary dictionaryWithObjects:valueArray forKeys:keyArray];
__block NSString *valueString = nil;
[enumDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
if([key isEqualToString:@"bb"])
{
valueString = obj;
*stop = YES;
}
}];

整个过程变的简单了。

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

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

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

最新文章

  1. 解决SmartGit序列号问题
  2. nyoj 下三角矩阵
  3. json_decode返回null 和synax error原因及处理
  4. 深入理解openstack网络架构(3)-----路由
  5. hdu5175 gcd 求约数
  6. oracle 11g dataguard创建的简单方法
  7. Apache服务器的下载与安装
  8. JNI的一些知识:
  9. [译] ASP.NET 生命周期 – ASP.NET 应用生命周期(一)
  10. Oracle的spool命令
  11. Spring中BeanPostProcessor
  12. c++ namespace命名空间详解
  13. HDU 5887 Herbs Gathering
  14. 怎样在chrome中内置扩展,以及一些简单的定制
  15. spring学习(一) ———— IOC讲解
  16. module.exports与exports的区别
  17. while与for不能互换的地方
  18. Angular2学习(一)
  19. PAT 1088 三人行(20 分)(暴力破解+流程分析)
  20. JVM学习记录-类加载器

热门文章

  1. hdu 6354
  2. jenkins 之 iOS 打包及上传至蒲公英
  3. luogu2394 yyy loves Chemistry I
  4. IE6 下绝对定位position:absolute 与浮动不显示 (IE6 下拉菜单显示)
  5. Selenium WebDriver-模拟鼠标双击某个元素
  6. 一张图展示:用两个栈来实现一个队列,完成队列的Push和Pop操作
  7. 2017"百度之星"程序设计大赛 - 资格赛
  8. 常见shell脚本命令整理
  9. linux 系统时间调整
  10. Jenkins+GitHub+maven