5
A
回答
0
简而言之,NSInvocation
不如块。它只是将单个方法调用封装在单个对象上,而块可以封装许多行任意代码。即使你的非常简单的平方块也不可能代表使用一个调用,而不需要现有类的支持,而这个类会自动调整平方。
3
NSInvocation
是一个消息(使用选择器)给一个对象,带有可选参数,可以稍后(或现在)执行,也可以在当前上下文之外执行(当然你也可以复制vs保留或引用,如果你移动它)。 NSInvocation
有一个好处,你可以有选择地复制/引用你所需要的。
该块是一个秘密的本地函数定义,它可以捕获当前线程的上下文的部分或完全。它比NSInvocation
配置起来要容易一些,因为它会自动捕获,复制并保留线程(或范围)本地上下文。块可以稍微增加二进制大小,类似于函数。如果从本地环境中取出(例如,当您复制块时),与NSInvocation
相比,块可能需要相当多的CPU时间和内存。
3
NSInvocation
是封装消息调用的对象:目标对象,选择器,参数和返回值。块是一个对象,它封装了一段代码和一些关于该段引导的程序状态的信息:具体来说,它将变量记录在调用堆栈中,直到创建块为止。
这两者都可以清楚地用作回调函数:您可以使用调用将消息发送给对象,也可以像函数一样执行块的代码。他们的不同之处在于你在各种情况下运输状态的方式。通过调用,您可能需要目标对象或其中一个参数来表示消息出现的上下文。使用块时,该上下文将从块创建时的状态自动捕获。
相关问题
- 1. .show()和.css({'display':'block'})有什么区别?
- 2. dpm()和dsm()之间有什么区别?
- 3. @dynamic和@synthesize之间有什么区别?
- 4. vbNullString和“”之间有什么区别吗?
- 5. * zoom和zoom之间有什么区别?
- 6. String.Concat,string.format和+之间有什么区别?
- 7. StaticLayout和DynamicLayout之间有什么区别
- 8. WebServiceBinding.EmitConformanceClaims和WebServiceBinding.ConformanceClaims之间有什么区别?
- 9. :: after和after之间有什么区别?
- 10. %.02f和%.2f之间有什么区别?
- 11. {$ var}和$ var之间有什么区别?
- 12. ReleaseFloatArrayElements和DeleteLocalRef之间有什么区别
- 13. {0}和“”之间有什么区别?
- 14. getA()和this.getA()之间有什么区别?
- 15. @observable和@published之间有什么区别
- 16. $ {}和#{}之间有什么区别?
- 17. url.getFile()和getpath()之间有什么区别?
- 18. KVC和Properties之间有什么区别?
- 19. Lazy.Force()和Lazy.Value之间有什么区别
- 20. “层”和“层”之间有什么区别?
- 21. 1.1em和1.05em之间有什么区别?
- 22. proc和lambda之间有什么区别?
- 23. ViewFlipper和ViewSwitcher之间有什么区别
- 24. typedef和宏之间有什么区别?
- 25. “$^N”和“$ +”之间有什么区别?
- 26. -existingObjectWithID:error:和-objectWithID之间有什么区别?
- 27. {0}和+之间有什么区别?
- 28. Locationmanager.locationListener和com.google.android.gms.location.LocationListener之间有什么区别?
- 29. $ .cache和$ .data之间有什么区别?
- 30. DateTime.UtcNow和DateTime.Now.ToUniversalTime()之间有什么区别
block是一个函数吗?或对象?正如@Justin所说:该块是一个秘密的本地函数定义 – holsety 2012-02-27 10:45:40
这是两个:)。块是一个匿名函数,以及创建块时的堆栈副本(或多或少)。它也是一个Objective-C对象,因此您可以创建块的副本并随后发布这些副本。当你执行这个块时,你只是在调用它的函数。尽管运行时也会在进入函数之前设置块的堆栈。 – 2012-02-27 10:52:36