如何让Scripting Bridge在运行时生成Objective-C类?

jma*_*mah 4 linker cocoa objective-c ld scripting-bridge

我今天正在更新Scripting Bridge粘贴文件(对于Mail.app),并注意到sdp(1)手册页显示:

您不需要创建相应的实现文件; Scripting Bridge将在运行时创建类实现.

这听起来很酷,但是我没有实现生成的类(如预期的那样):

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_MailApplication", referenced from:
      objc-class-ref in DMBugReportWindowController.o
  "_OBJC_CLASS_$_MailAttachment", referenced from:
      objc-class-ref in DMBugReportWindowController.o
[... more of the same ...]
ld: symbol(s) not found for architecture x86_64`
Run Code Online (Sandbox Code Playgroud)

我不想压制所有未定义的符号,因为这可能很容易掩盖合法的问题,所以我只是使用-U(根据ld(1)手册页):

指定symbol_name没有定义是可以的.使用-two_levelnamespace,结果符号将标记为dynamic_lookup,这意味着dyld将搜索所有已加载的图像.

(我必须使用-Xlinker -U -Xlinker _OBJC_CLASS_$_MailApplication那些标志来达到ld,否则clang会保留这些参数.)

显然制作它们dynamic_lookup是错误的,因为这会在启动时出现动态链接错误:

dyld: Symbol not found: _OBJC_CLASS_$_MailApplication
  Referenced from: /Users/jonathon/Library/Developer/Xcode/...
  Expected in: flat namespace
 in /Users/jonathon/Library/Developer/Xcode/...
Run Code Online (Sandbox Code Playgroud)

如果我使用-force_flat_namespace -undefined suppress(我不想使用,如上所述),也会发生这种情况.该脚本桥接编程指南似乎在暗示我做是正确的事情("准备代码"一节),但没有提到这个问题.

Nic*_*idt 5

由于该类是动态创建的,因此无法链接到该类.该类将在运行时注册,但不会导出符号,链接器将无法找到它.

您需要将发送到MailApplicationMailAttachment发送消息的所有消息替换为NSClassFromString(@"MailApplication")NSClassFromString(@"MailAttachment").

[MailApplication class]NSClassFromString(@"MailApplication")[MailAttachment class]NSClassFromString(@"MailAttachment").