Objective-C中的块与普通方法和函数有何不同?

13

在Objective-C中,使用块(Blocks)相比普通方法和函数有什么优势?我已经阅读了文档,但没有找到关于使用块而不是其他语言特性的具体用例。

我确定我错过了一些东西,所以能否有人以比现有文档更简单的方式解释块的优点?

2个回答

13

块(Block)是一种将一段代码封装并有效地存储以备后用的方法。块通常用于代替回调函数,在iPhone SDK中的新API中经常使用块这种方式。API会接受一段“块”(block)代码,并在完成后运行它。

使用块可以避免创建自己的线程,维护每个线程的状态,管理锁、设置自动释放池等繁琐的工作。

当与Grand Central Dispatch (GCD) API一起使用时,块可以在队列上运行,整个代码段可以非常轻松地异步运行,但仍保持了多线程编程所需的健壮性。


我知道在使用GCD时它的重要性,但除此之外,我发现很难理解回调(callback)等术语。文档使用了复杂的术语,所以如果有人能用初学者的语言告诉我块(blocks)的真正用途,那就太好了。请保持简单,并可以解释一些代码,那将是非常棒的...谢谢。 - Ajay Pandey
4
有哪种语言让您感到困难?回调是在应用程序或系统内发生某些事情时触发的方法或函数。块可让您定义响应事件发生时发生的动作,但不需要编写单独的方法或函数,它们允许您在设置该事件的侦听器时直接编写处理代码。这可以节省大量的代码,并使您的应用程序更加有组织。 - Brad Larson
那是我之前的理解,但现在得到了确认。谢谢。 - Ajay Pandey

10

我喜欢苹果的"一个简短实用的块指南"作为介绍概念的资料。

此外,几乎所有在回答"建议学习Snow Leopard中块的资源"时提到的资源都适用于这里。

除了那些资源,我还推荐Drew McCormack的文章"Cocoa for Scientists(第XXVII部分):使用Objective-C闭包""Cocoa for Scientists(XXXIII):C/Objective-C中10个块的用途", 以及Joachim Bengtsson的"使用C块编程"

WWDC 2010视频第206和211会话的内容"介绍iPhone上的块和Grand Central Dispatch"以及"通过Grand Central Dispatch简化iPhone应用程序开发"也值得观看。


我不是在寻找Snow Leopard中的代码块,而是在寻找iPhone和iPad的相关内容。至于第一个链接,我对其解释的方式并不太满意。你能否为我推荐一些关于代码块的初步代码呢?那将会是非常有帮助的。 - Ajay Pandey
@Ajay Pandey - 在Snow Leopard和iOS 4.0中,块之间没有功能上的区别。语言语法相同,Grand Central Dispatch也相同,因此那里的所有链接都适用于此处。要求块的示例代码就像要求方法或函数的示例代码一样。它是核心语言特性,因此很难创建一个真正基本的示例。 - Brad Larson
@Ajay Pandey - 我在我的回答中添加了一些可能有用的资源。 - Brad Larson
2
回答摘要。 - circuitry
有趣的是,这个回复提到了几个参考资料,但实际上并没有回答问题。 - xpereta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接