【问题标题】:Ignoring code branches if libraries are missing via xcode如果通过 xcode 缺少库,则忽略代码分支
【发布时间】:2012-02-15 17:11:53
【问题描述】:
在 AdWhirl SDK(一个多广告网络组合)中,该框架的结构是这样的,如果您不另外从 Google AdSense 或 AdMob 导入随附的库,它只会忽略那些代码分支在编译和运行代码时。也就是说,框架中有代码需要 AdSense SDK 才能运行,但如果您不包含 AdSense,它只会忽略该代码,不会出现编译器错误或任何问题。没有用户需要的代码注释或类似的东西。
我正在尝试构建一个具有类似要求的框架,但我终其一生都无法弄清楚他们是如何做到这一点的。显然,默认情况下,由于缺少库,您将在编译时在代码中出现链接器错误。如何导出具有此功能的框架(当前为 .a 文件)?
【问题讨论】:
标签:
iphone
objective-c
ios
xcode
frameworks
【解决方案1】:
当您执行以下操作时:
[[ClassName alloc] init]
您实际上正在做的是将alloc 消息发送到ClassName 元类,然后将init 发送到元类尝试返回的ClassName 的实例(或者如果元类返回,则发送给任何人) nil 资源不足)。
此外,Objective-C 运行时是反射性的。除此之外,这意味着您可以查询它以从类的字符串名称中查找元类。例如
Class metaclass = NSClassFromString(@"ClassName");
如果该类不存在,则返回命名元类或nil。把它放在一起:
id instance = [[NSClassFromString(@"ClassName") alloc] init];
如果应用程序知道此类并且有合适的资源可用,将为您提供该类的实例。因此,对于可选链接库,这是一种尝试获取类实例但如果包含该类的库未链接时安全失败的方法。