【发布时间】:2012-02-29 02:53:55
【问题描述】:
当我说阻止时,我的意思是:
^(int a) {return a*a;};
另外,block 只支持 iOS4 及以上版本。
这两者有什么区别?
【问题讨论】:
标签: objective-c objective-c-blocks nsinvocation
当我说阻止时,我的意思是:
^(int a) {return a*a;};
另外,block 只支持 iOS4 及以上版本。
这两者有什么区别?
【问题讨论】:
标签: objective-c objective-c-blocks nsinvocation
NSInvocation 是一个消息(使用选择器)到一个对象,带有可选参数,可以稍后(或现在)执行,并且在当前上下文之外(当然要注意你复制的内容与保留或引用 if你移动它)。 NSInvocation 的好处是您可以选择性地复制/引用您需要的内容。
块是一个秘密的本地函数定义,它能够捕获当前线程上下文的一部分,或者完全捕获。它也比NSInvocation 更容易配置,因为它会自动捕获、复制和保留线程(或范围)本地上下文。块可以稍微增加你的二进制大小,类似于函数。如果脱离本地上下文(例如,当您复制一个块时),与 NSInvocation 相比,块可能需要更多的 CPU 时间和内存。
【讨论】:
NSInvocation 是一个封装了消息调用的对象:目标对象、选择器、参数和返回值。块是一个对象,它封装了一段代码和一些关于导致该部分的程序状态的信息:具体来说,它记录调用堆栈上的变量,直到创建块。
这两者都可以清楚地用作回调:您可以使用调用向对象发送消息,或者您可以像执行函数一样执行块的代码。它们的不同之处在于您在每种情况下传输状态的方式。通过调用,您需要目标对象或参数之一来表示消息出现的上下文。使用块时,会从创建块时的状态自动捕获此上下文。
【讨论】:
简单地说,NSInvocation 的功能不如块。它只是封装了对单个对象的单个方法调用,而块可以包装多行任意代码。如果没有现有类的支持,即使是非常简单的平方块也无法使用调用来表示,该类本身会进行平方。
【讨论】: