3

我已经在这里搜索了关于 SO 的问题,寻找任何关于我为什么会看到这种行为的提示,但还没有。


考虑一个类(实际上是两个表现出相同问题的类),内置在一个静态库中,包装在一个框架包中(使用的步骤)。它们继承自 Foundation 框架类集群(NSMutableDictionaryNSMutableArray)。

这些类的使用依赖于在静态函数(不是类方法!)用于分配和初始化实例(我猜是一种工厂辅助函数?)之前初始化的一些静态变量。

当 iOS 应用程序项目链接到该框架时,模拟器和设备之间的 Objective-C 运行时类加载行为会有所不同。

具体来说,在设备(iPhone 4、iOS 4.3.3)上,当加载应用程序时,这些类没有收到+load消息,并且静态变量没有初始化,因此静态工厂方法失败。在模拟器上,消息被发送,并且所有工作都按预期进行。设备运行时是否有问题

我的问题是,可以对我的框架进行不同的配置以确保+load发送消息吗?还是我在 iOS 中遇到了静态库/框架类加载的错误?


这些类来自JSONKit库 ( JKArray, JKDictionary)。

这里有一个说明这个问题的示例项目——https: //github.com/ohhorob/JSONKit-in-framework-demo


编辑:根据@bbum 的建议,我已经验证了JKDictionaryJKArray类实际上在应用程序运行时已加载并且可用。DeviceBrokenGitHub 项目上的分支已使用所使用的验证进行更新。

我向 Apple 提交了错误报告 (#9461567)。

4

2 回答 2

5

未调用这些+load方法是因为您实际上并未创建静态库而是创建了可重定位对象文件。如果您使用make-fmwkiOS 通用框架模板创建静态框架,则加载方法将按预期调用。

于 2011-05-25T12:47:34.130 回答
3

奇怪的; 我会做一个NSLog(@"klassy klass %@", [MysteryClass class]);并确保实际加载了类(但请参见下文——这可能会“解决”问题)。

如果是,那么这是 DYLD 加载程序中的错误,请归档。

如果不是,那么链接器很可能正在剥离类,因为没有直接引用它们。尝试添加[MysteryClass class]应用程序的applicationDidFinishLaunching:方法(实际上并不重要,甚至,如果它被执行......但这将是一个明显的地方)。

另外,我建议不要使用+load,而是编写构造函数。IE:

__attribute__((constructor))
static void initLibrary()
{
    ....
}

如果这是一个链接器问题,那可能会也可能不会解决问题。+load然而,与相当神奇的方法相比,你的意图要清楚得多。

于 2011-05-18T17:17:51.817 回答