当我无法对它进行弱连接时,如何测试一个类的存在

时间:2013-03-06 20:09:33

标签: ios objective-c

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

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

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

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

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

接下来尝试了:

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

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

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

2 个答案:

答案 0 :(得分:9)

你必须全程使用反射。将您的代码更改为:

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

答案 1 :(得分:3)

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

#if MYLIB_ENABLE_FLURRY

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

#endif //MYLIB_ENABLE_FLURRY

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