【问题标题】:Where is objc_msgSend once you upgrade to Xcode 5?升级到 Xcode 5 后,objc_msgSend 在哪里?
【发布时间】: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++代码什么的……嗯嗯。

标签: xcode5


【解决方案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 文件。但这仍然回答了实际问题。 :)
    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多