【问题标题】:What's the difference between NSInvocation and block?NSInvocation 和 block 有什么区别?
【发布时间】:2012-02-29 02:53:55
【问题描述】:

当我说阻止时,我的意思是:

^(int a) {return a*a;};

另外,block 只支持 iOS4 及以上版本。

这两者有什么区别?

【问题讨论】:

    标签: objective-c objective-c-blocks nsinvocation


    【解决方案1】:

    NSInvocation 是一个消息(使用选择器)到一个对象,带有可选参数,可以稍后(或现在)执行,并且在当前上下文之外(当然要注意你复制的内容与保留或引用 if你移动它)。 NSInvocation 的好处是您可以选择性地复制/引用您需要的内容。

    块是一个秘密的本地函数定义,它能够捕获当前线程上下文的一部分,或者完全捕获。它也比NSInvocation 更容易配置,因为它会自动捕获、复制和保留线程(或范围)本地上下文。块可以稍微增加你的二进制大小,类似于函数。如果脱离本地上下文(例如,当您复制一个块时),与 NSInvocation 相比,块可能需要更多的 CPU 时间和内存。

    【讨论】:

      【解决方案2】:

      NSInvocation 是一个封装了消息调用的对象:目标对象、选择器、参数和返回值。块是一个对象,它封装了一段代码和一些关于导致该部分的程序状态的信息:具体来说,它记录调用堆栈上的变量,直到创建块。

      这两者都可以清楚地用作回调:您可以使用调用向对象发送消息,或者您可以像执行函数一样执行块的代码。它们的不同之处在于您在每种情况下传输状态的方式。通过调用,您需要目标对象或参数之一来表示消息出现的上下文。使用块时,会从创建块时的状态自动捕获此上下文。

      【讨论】:

      • 块是函数吗?或对象?正如@Justin 所说:该块是一个秘密的本地函数定义
      • 两者都是:)。块是一个匿名函数,以及创建块时的堆栈副本(或多或少)。它也是一个 Objective-C 对象,因此您可以创建块的副本并随后释放这些副本。当你执行这个块时,你实际上只是在调用它的函数;虽然运行时也会在进入函数之前设置块的堆栈。
      【解决方案3】:

      简单地说,NSInvocation 的功能不如块。它只是封装了对单个对象的单个方法调用,而块可以包装多行任意代码。如果没有现有类的支持,即使是非常简单的平方块也无法使用调用来表示,该类本身会进行平方。

      【讨论】:

        猜你喜欢
        • 2013-07-04
        • 1970-01-01
        • 2017-08-02
        • 2012-02-16
        • 2020-05-11
        • 1970-01-01
        • 2015-03-25
        • 1970-01-01
        • 2023-02-13
        相关资源
        最近更新 更多