2

我知道,至少在 OS X 上,由于 Apple 的 Objective-C 运行时加载类的方式,不可能动态卸载包含已加载类的实现的动态库。对于只知道引用标头的对象但不包含任何类的方法实现的库,这是否成立?

为清楚起见,我想使用 Objective-C 来编写动态库,但会加载和卸载带有ResultObject* performActionOnObject(SomeObject* object).

编辑:

为了更清楚,考虑一个函数,如

NSNumber* computeFactorial(NSNumber* operand){
  NSUInteger n = [operand unsignedIntegerValue];
  /// ... pure C loop omitted
  return [NSNumber numberWithUnsignedInteger:n];
}

并假设当它被调用时,自动释放池处于活动状态。这样卸货可以吗?

4

1 回答 1

2

如果客户端直接引用您的类,如果该类不在链接的二进制文件中,则会导致链接器错误。您可以在运行时加载/卸载类,但您需要通过它们的名称(字符串)查找它们才能使用它们。在按名称查找课程之前,您还需要注册课程。

您可以将 C 函数传递给运行时调用class_addMethod,例如method_exchangeImplementations在运行时扩展/更改 ObjC 类。

谷歌搜索“method swizzling”将引导您找到示例。

所以最终……“这取决于你如何与对象交互”。

于 2013-03-06T17:29:46.873 回答