gpt4 book ai didi

ios - 不明白 NSClassFromString 如何用于条件调用

转载 作者:可可西里 更新时间:2023-11-01 04:36:03 25 4
gpt4 key购买 nike

我的项目中有一个测试类,它在开发阶段就存在,但会为应用商店构建编译出来。

我在几本书中读到 NSClassFromString 可用于确定类是否存在,示例代码如下:

if (NSClassFromString(@"SomeClass") != nil)
{
[SomeClass someMethod];
}
else
{
code not using SomeClass
}

然而,在我的项目中将其付诸实践后,我发现我在删除包含 SomeClass 的源文件的目标时遇到链接错误。

因此,我的结论是,这种用于确定某个类存在/不存在的机制仅在该类位于您使用其他类的库或源文件中时才有用(提及此技术的书中缺少详细信息).还是我遗漏了什么?

最佳答案

NSClassFromString 搜索命名类的运行时。事实上,它将确定该类是否存在。

为了让编译器成功地获取像 [SomeClass someMethod] 这样的静态引用,它需要一些链接。

你是对的,当你链接到 Foundation 之类的东西时,该机制因此起作用,Apple 在那里添加了一个额外的类,比如检查 NSJSONSerialization 是否存在。

如果您针对可能存在或可能不存在的框架进行弱链接,它也适用。所以例如您可以弱链接到 Twitter.framework 并使用 [TWRequest alloc] ...。您仍然可以在根本没有 Twitter 框架的 iOS 4 上构建和部署。

Apple 实际上已经稍微修改了库的存储方式,并正在过渡到允许 if([TWRequest class]) 或任何用于代替显式 NSClassFromString 薄弱环节。

但是在您的情况下,听起来您想链接到静态库还是不链接到它?所以该类在运行时可能可用也可能不可用,但也可能对链接器可见也可能不可见?

在那种情况下,您只需要避免对元类的字面引用。所以你可以这样做:

Class someClassMetaClass = NSClassFromString(@"SomeClass");

if(someClassMetaClass)
{
SomeClass *instance = [[someClassMetaClass alloc] init];
/* ... */
}

只要头文件可见,编译器就会很乐意允许您为指针指定 SomeClass 类型(因为无论如何它都不会进入二进制文件)并且能够建议针对已发布界面的常见自动完成和警告。只需确保始终通过指向从运行时而不是直接获取的 Class 的指针来寻址元类。这样一来,链接器就不需要跟进任何事情了。

关于ios - 不明白 NSClassFromString 如何用于条件调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13811255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com