闭包在计算机中的应用,详解Objective-c闭包简单应用

本文介绍了Objective-C中的闭包(Block)概念及其应用。闭包在函数式编程中常见,Objective-C中称为Block,它允许函数引用自由变量并在脱离原始环境的情况下使用。文章通过示例展示了如何定义和使用Block,特别提到了在iOS的GCD(Grand Central Dispatch)中Block的重要性。此外,还讨论了Block与函数指针的区别,如Block的便捷性和向下兼容性。闭包在简化动画效果等场景下提供了更灵活的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

概念介绍

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

Objective-c的闭包

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

Objective代码

typedef int (^IntBlock)();

IntBlock downCounter(int start)

{

__block inti=start;

return Block_copy( ^int(){return i--; }); }

IntBlockf=downCounter(5);

printf("%d", f());

printf("%d", f());

printf("%d", f());

Block_release(f);

}

typedef int (^IntBlock)();

IntBlock downCounter(int start)

{

__block inti=start;

return Block_copy( ^int(){return i--; }); }

IntBlockf=downCounter(5);

printf("%d", f());

printf("%d", f());

printf("%d", f());

Block_release(f);

}

是这么简单。

闭包应用

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

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

Objective-c代码

[self beginAnimation];

[self animationAction];

[self endAnimation];

[self beginAnimation];

[self animationAction];

[self endAnimation];

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

Objective-c代码

+ (void)animation:(NSTimeInterval)duration withEvent:(animationEvent)event

{

[UIView beginAnimations:@"animationID" context:nil];

[UIView setAnimationDuration:duration];

[UIView setAnimationCurve:UIViewAnimationCurveLinear];

[UIView setAnimationRepeatAutoreverses:NO];

event();

[UIView commitAnimations];

}

[Tools animation:0.8 withAnimationCurve:UIViewAnimationCurveEaseInOut withEvent:^{[

UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:centerView_ cache:YES];

// 移除功能列表

[menuView_ removeFromSuperview];

// 增加二次拔号键盘

[centerView_ addSubview:phonePad_ ];

}

];

+ (void)animation:(NSTimeInterval)duration withEvent:(animationEvent)event

{

[UIView beginAnimations:@"animationID" context:nil];

[UIView setAnimationDuration:duration];

[UIView setAnimationCurve:UIViewAnimationCurveLinear];

[UIView setAnimationRepeatAutoreverses:NO];

event();

[UIView commitAnimations];

}

[Tools animation:0.8 withAnimationCurve:UIViewAnimationCurveEaseInOut withEvent:^{[

UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:centerView_ cache:YES];

// 移除功能列表

[menuView_ removeFromSuperview];

// 增加二次拔号键盘

[centerView_ addSubview:phonePad_ ];

}

];

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

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

【编辑推荐】

【责任编辑:李程站 TEL:(010)68476606】

点赞 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值