4

我正在编写一个设计为可重用的类,但我已经包含了对编译时可能并不总是可用的类的调用。

更具体地说,我正在使用 Flurry 分析,并且我想包含对它的调用 - 但不是这个模块可能包含的每个项目都可以访问 Flurry 库 - 我只是希望它不会在这些代码中编译情况。该模块将作为源代码分发,因此只需在编译时进行测试。

到目前为止,我已经尝试过:

if([Flurry class]){
    [Flurry logEvent:@"Blah"];
}

这失败了“使用未定义的标识符” - Flurry 没有在任何地方定义,因为没有对库的弱引用

所以接下来尝试:

Class flurryClass = NSClassFromString(@"Flurry");
if(flurryClass){
  [flurryClass logEvent:@"Blah"];
}

这失败为“选择器 logEvent 没有已知的类方法”

所以我似乎被卡住了,因为第一种方法依赖于弱链接一个可能无法用于弱链接的库!我假设的第二种方法失败,因为我在当前没有定义的 Class 上调用 Class 方法,所以编译器会抱怨?有没有人能想到的解决方案?

4

2 回答 2

9

你必须在整个过程中使用反射。将您的代码更改为:

Class flurryClass = NSClassFromString(@"Flurry");
if(flurryClass){
  [flurryClass performSelector:@selector(logEvent:) withObject:@"Blah"];
}
于 2013-03-06T20:19:45.323 回答
3

我会避免让您的图书馆在未经他人许可的情况下自动将乱舞事件记录到其他人的帐户中。我会推荐预处理器检查并要求实现者明确启用 Flurry。

#if MYLIB_ENABLE_FLURRY

    if([Flurry class]){
        [Flurry logEvent:@"Blah"];
    }

#endif //MYLIB_ENABLE_FLURRY

现在,如果有人想从您的库中添加日志记录,您可以指示他们需要 Flurry 并使用-DMYLIB_ENABLE_FLURRY=1或将其添加到其他 C 标志(如果他们直接包含源代码)来编译您的库。

于 2013-03-06T20:44:16.843 回答