在D.中动态绑定外部(Objective-C)类



我想在我的D应用程序中大量使用extern (Objective-C)类,因为我不想手动发送Objective-C消息。然而,我主要使用AppKit、IOKit和Foundation等框架,extern (Objective-C)需要静态链接才能根据文档工作。

但是,我不认为静态链接操作系统库是个好主意。考虑到不同的macOS版本,它似乎相当脆弱。

所以我的问题是,

  1. 静态链接Foundation和AppKit真的是个坏主意吗
  2. 如果是,那么是否可以动态加载带有dlopen的.framework文件,然后将函数指针绑定到extern (Objective-C)
  1. 否。我认为这不是问题,这是相对标准的做法。当然,你将无法在同一个二进制文件中为macOS和iOs构建,但这是一种罕见的情况。如果你使用dlopen框架,你可能会发现它们有时也会在macOS版本中移动。Apple不时有其他方法来破坏您的向后兼容性,但删除您下面的框架并不常见。您将成为extern(Objective-C(的首批幸运用户之一。

  2. 是的,这是绝对可能的。但是,您必须直接与ObjC运行时对话,因为自OSX以来,没有导出任何函数,只有类ID。您必须为要调用的每个方法编写一些脆弱的代码。从协议继承是非常困难的。你真的不能那样做太多。从好的方面来说,它在DMD和LDC中的工作原理相同。您可以签入dplug:cocoa。我真的建议使用extern(Objective-C(和静态链接。

最新更新