升级到 Xcode 5 后,objc_msgSend 在哪里?

Posted

技术标签:

【中文标题】升级到 Xcode 5 后,objc_msgSend 在哪里?【英文标题】:Where is objc_msgSend once you upgrade to Xcode 5? 【发布时间】:2013-09-24 15:31:36 【问题描述】:

这段代码昨天还在工作:

id urlNSString = objc_msgSend(objc_getClass("NSString"), sel_registerName("stringWithUTF8String:"), "http://zmangames.com/product-details.php?id=1246");
objc_msgSend(objc_getClass("EAGLView"), sel_registerName("openURL:"), urlNSString);

我刚刚升级到 Xcode 5,现在它说该函数未定义。我在做

#include <objc/message.h>
#include <objc/objc.h>
#include <objc/runtime.h>

这似乎在 /usr/include/objc 中,并且似乎包含函数的定义。整个项目我没有收到任何其他投诉。

Codesense 表示定义如下所示:

OBJC_EXPORT id objc_msgSend(id self, SEL op, ...) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

【问题讨论】:

为什么你需要这样做而不是写普通的Objective-C代码? 我在.cpp文件中,并且Obj-C编译器没有激活。 他可能在写 c 或 c++ 看来你可以写Objective-C++代码什么的……嗯嗯。 【参考方案1】:

改用#import &lt;objc/runtime.h&gt;

【讨论】:

【参考方案2】:

知道了。没有足够仔细地检查错误。

Candidate function not viable: no known conversion from 'Class' (aka 'objc_class *') to 'id' (aka 'objc_object *') for 1st argument

只需要将 objc_getClass 的返回值从 Class 转换为 id,如下所示:

id urlNSString = objc_msgSend((id)objc_getClass("NSString"), sel_registerName("stringWithUTF8String:"), "http://zmangames.com/product-details.php?id=1246");
objc_msgSend((id)objc_getClass("EAGLView"), sel_registerName("openURL:"), urlNSString);

【讨论】:

你为什么不把那个文件变成一个.mm 文件而不是使用所有的包袱? 这是别人的代码库,是关键任务代码。它将于 10 月 3 日在 App Store 上发布,我不会做一些我不确定的事情,直到我能够对其进行一些测试。否则,你提出了一个很好的观点。 :) 好的 - 任务关键听起来像是一个更好的理由来抛弃这些废话。 有时间来改变它,它现在是一个带有适当 Obj-C 调用的 .mm 文件。但这仍然回答了实际问题。 :)

以上是关于升级到 Xcode 5 后,objc_msgSend 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

升级到 Xcode 8 后出现 GCC 5.4 链接器错误

升级到 Xcode 5 后,objc_msgSend 在哪里?

升级到 Xcode 4.2/iOS 5 后,类别中的方法引发异常

Xcode 5 升级后我的应用程序下方的白条

升级到flutter 2.5.0后出现很多错误

将 XIB 从 Xcode 5 降级到 Xcode 4.6