详解Objective-c闭包简单应用

移动开发 iOS
本文介绍的是详解Objective-c闭包简单应用,这里的闭包自然是计算机语言中的闭包,词法闭包(Lexical Closure)的简称,来看内容。

详解Objective-c闭包简单应用是本文要介绍的内容,主要介绍的是闭包的应用,不多说,文章中介绍的已经很详细,我们先来看内容详解。

概念介绍

这里的闭包自然是计算机语言中的闭包,词法闭包(Lexical Closure)的简称,主要表现在函数可以引用到自由变量,并且可以脱离变量的创建环境,再复杂的定义也不需要多说明了,可以理解为面向对象里面的成员函数可以调用其成员变量,然其概念却比面向对象的概念流行早的多,约六十年代在Scheme里就实现了。函数式编程语言里这是非常常见的概念,而非函数式的语言中js里也有很多闭包出现的身影。

Objective-c的闭包

准确地说在Objective-c里不叫闭包(Closure)而叫Block,但概念还是大同小异的。Mac平台上需要LLVM的支持,总之较新的Xcode都是支持这个特性的。 自由变量在使用是需要用__block关键字定义,而闭包函数的形式与函数指针非常接近,简单地说把函数指针的*换成^就可以了

Objective代码 

  1. typedef int (^IntBlock)();      
  2.       
  3. IntBlock downCounter(int start)      
  4. {     
  5.     __block int i = start;     
  6.      return Block_copy( ^int(){return i--; }); }     
  7.     IntBlock f = downCounter(5);     
  8.     printf("%d", f());     
  9.     printf("%d", f());     
  10.     printf("%d", f());     
  11.     Block_release(f);     
  12. }    
  13.  
  14. typedef int (^IntBlock)();   
  15.    
  16. IntBlock downCounter(int start)   
  17. {  
  18.     __block int i = start;  
  19.      return Block_copy( ^int(){return i--; }); }  
  20.     IntBlock f = downCounter(5);  
  21.     printf("%d", f());  
  22.     printf("%d", f());  
  23.     printf("%d", f());  
  24.     Block_release(f);  

是这么简单。

闭包应用

单纯就语法而言,闭包并没什么好谈的,但它的应用已经越来越广,特别是iPhone新的GCD特性,广泛使用了闭包,如果不知到闭包怎么写,就会陷入明明系统提供了接口却无法调用的尴尬境地。 可能会觉得,出了系统接口必须要用block而不得不使用的情况外,其他时候直接用函数指针不就得了,实际上除非你真的用到了自由变量,其他时候 block和函数指针确实没什么区别,但block也有自己的独到之处。

首先它不需要事先定义函数,如果是函数指针那么必须要把指针指向一个函数,而函数必须要定义,闭包则不然,直接对代码块就可以调用 其次就算已经事先定义好了函数,只要对函数名取一下^即可直接放到闭包的地方使用,可以理解为向下兼容吧。 比如iPhone的动画效果,你必须先开始动画,然后写你想要动画的操作,***提交,而开始动画和提交之间的鸿沟没法很好的协调,相当于这样

Objective-c代码  

  1. [self beginAnimation];     
  2. [self animationAction];     
  3. [self endAnimation];    
  4.  
  5. [self beginAnimation];  
  6. [self animationAction];  
  7. [self endAnimation];  

而且每个动画都必需事先其专门的animationAction而iPhone的动画效果实在是个很平常的操作,这就多出了无数冗余函数,即使它只是一行hidden之类,而且也不方便扩展,闭包就很适合这种需求

Objective-c代码 

  1. + (void)animation:(NSTimeInterval)duration withEvent:(animationEvent)event     
  2. {      
  3.     [UIView beginAnimations:@"animationID" context:nil];     
  4.     [UIView setAnimationDuration:duration];     
  5.     [UIView setAnimationCurve:UIViewAnimationCurveLinear];     
  6.     [UIView setAnimationRepeatAutoreverses:NO];     
  7.     event();     
  8.     [UIView commitAnimations];     
  9. }     
  10.       
  11. [Tools animation:0.8 withAnimationCurve:UIViewAnimationCurveEaseInOut withEvent:^{[     
  12.     UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:centerView_ cache:YES];     
  13.         // 移除功能列表     
  14.     [menuView_ removeFromSuperview];     
  15.         // 增加二次拔号键盘     
  16.     [centerView_ addSubview:phonePad_ ];     
  17.     }     
  18. ];    
  19.  
  20. + (void)animation:(NSTimeInterval)duration withEvent:(animationEvent)event  
  21. {   
  22.     [UIView beginAnimations:@"animationID" context:nil];  
  23.     [UIView setAnimationDuration:duration];  
  24.     [UIView setAnimationCurve:UIViewAnimationCurveLinear];  
  25.     [UIView setAnimationRepeatAutoreverses:NO];  
  26.     event();  
  27.     [UIView commitAnimations];  
  28. }  
  29.    
  30. [Tools animation:0.8 withAnimationCurve:UIViewAnimationCurveEaseInOut withEvent:^{[  
  31.     UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:centerView_ cache:YES];  
  32.         // 移除功能列表  
  33.     [menuView_ removeFromSuperview];  
  34.         // 增加二次拔号键盘  
  35.     [centerView_ addSubview:phonePad_ ];  
  36.     }  
  37. ];  

当然了,闭包最重要的概念还是自由变量什么的,可惜我一致没法理解,这里仅仅是拿它当快捷的函数包裹来使用了。

小结:详解Objective-c闭包简单应用的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-07-29 16:16:30

Objective-c block

2014-06-25 14:02:59

Objective-CKVO

2011-08-17 10:58:59

Objective-C构造函数

2011-07-19 17:24:31

Objective-C 对象

2011-07-18 16:36:51

Objective-C XCode

2015-10-08 10:01:10

Objective-CLayout

2014-04-01 10:50:42

iOS开发runtimeObjective-C

2011-08-17 10:29:39

Objective-C预处理

2011-08-04 13:38:01

Objective-C C++

2011-08-15 14:32:42

Objective-C委托协议

2011-08-01 17:11:43

Objective-C 函数

2011-08-17 11:05:22

Objective-C方法

2014-04-28 09:56:56

Objective-CiOS命名空间

2011-08-16 10:23:04

Objective-CNSAutoreleaXcode常用键

2011-07-08 18:44:09

Objective-C Self Super

2011-08-16 13:43:40

Objective-C文件cocoa

2011-07-29 15:47:21

iPhone开发 Objective- C

2011-08-04 18:14:42

Objective-C 消息

2011-07-27 16:36:03

iphone Objective- 静态库

2011-08-04 10:04:17

Objective-C 分类 协议
点赞
收藏

51CTO技术栈公众号