Objective-C 问题

标签 objective-c

我是 Objective-C 的新手,我有一些问题:

  1. 什么是 IMP?

  2. 什么是msgSend函数?

最佳答案

IMP 是一个实现指针,它基本上是确定在收到消息(如 foo length)后运行的内容的钩子(Hook)。通常你不需要它们,除非你心情不好或者脏兮兮的。处理选择器通常更容易。

6.1 What is an IMP ?

   It's the C type of a method implementation pointer, a function

pointer to the function that implements an Objective-C method. It is defined to return id and takes two hidden arguments, self and _cmd :

   typedef id (*IMP)(id self,SEL _cmd,...);

6.2 How do I get an IMP given a SEL ?

   This can be done by sending a methodFor: message :

IMP myImp = [myObject methodFor:mySel];

6.3 How do I send a message given an IMP ?

   By dereferencing the function pointer. The following are all
   equivalent :

[myObject myMessage];

   or

IMP myImp = [myObject methodFor:@selector(myMessage)];
myImp(myObject,@selector(myMessage));

   or

[myObject perform:@selector(myMessage)];

摘自 Objective C FAQ 的第 6.1 节.

至于 msgSend,这是在另一个对象上调用远程消息的方式; objc_msgSend(foo,@selector(bar)) 与 [foo bar] 大致相同。但这些都是底层的实现细节;您很少(如果有的话)需要使用 Objective C 代码的扩展调用,因为您可以使用 @selector 来获取方法并执行 PerformSelector: 在任何对象上调用它。

关于Objective-C 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1192614/

相关文章:

objective-c - "Creating selector for nonexistent method ' 的 Xcode 虚假警告比较 :'"

objective-c - 我们需要检查对象是否实际分配了吗?

ios - 如何从 UITextField 中获取非英文字符并将其视为普通字符

iphone - 后端和 Objective-C/Cocoa 之间通信的格式

objective-c - 如何创建一个c数组?

objective-c - 我应该在 Objective C 中哪里初始化变量?

ios - 内容类型 JSON SIGABRT 错误

ios - iOS:如何知道GMSMapView的缩放级别

ios - 打印应用内购买交易收据?

ios - 如何以递增顺序在数组中追加字符串