cocoa-touch - 为什么我要使用 NSInitation 而不是 Block?

标签 cocoa-touch cocoa objective-c-blocks nsinvocation

有人可以提供使用 NSInitation 而不仅仅是使用 Block 甚至常规方法调用的具体原因吗?我在网络上找到了 NSInspiration 的描述,但没有说明它在哪里使用至关重要的示例,甚至没有说明它是唯一好的选择。

最佳答案

NSIncations 和 block 都可以用来封装方法调用,以及直到运行时才定义的参数和接收器。在 block 存在之前,NSInitation 是执行此操作的唯一方法。如果这就是您需要做的全部,那么 block 是更好的选择。如今,NSInspiration 的使用相当罕见。

但是,与可以表示任意数量的代码以及捕获的值的 block 不同,NSInitation 始终表示单个方法调用。

这有一些优点:

  1. 与不透明的 block 不同,可以查询 NSInitation 以获取选择器、接收器、参数和调用方法的签名。如果您收到一个 NSInitation 作为方法的参数(与 NSObject 的 -forwardInitation 一样),您可以提取参数并调用不同的方法。

  2. 可以使用 -initWithMethodSignature: 在运行时为任意方法调用构造 NSInitation。例如,如果您想为 Objective-C 实现 eval() 函数,您可以使用 NSInitation 来实际调用这些方法。

关于cocoa-touch - 为什么我要使用 NSInitation 而不是 Block?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23254496/

相关文章:

objective-c - 在Xcode中组织大型Cocoa应用程序源代码的最佳方法是什么?

macos - 如何将 NSPersistentContainer 与 NSPersistentDocument 一起使用

ios - 在诸如fetchIfNeededInBackgroundWithBlock之类的 block 中使用PFObject的子类时出现问题

ios - 在后台队列中运行多个 api 调用而不卡住 UI?

ios - 带有 Objective-C 函数的 Swift block 语法 [Venmo-iOS-SDK]

ios - prepareForSegue : is not called after tapping a row in UITableView

objective-c - -[NSNotificationCenter postNotificationName :object:] Can I pass nil for object?

objective-c - 如何设置NStextfield在 cocoa 中复选框时显示为****返回字符

cocoa-touch - 如何从分段控件接收输入

objective-c - Kiwi 规范单元测试 : Instance method '-attachToVerifier:verifier:' not found