我刚想到了一个简单的场景,让我自己来玩NSClassFromString
和Objective-C运行时。
的背景 的
想象一下,我有一个类方法,我根据某些条件从类创建一个实例,让我们说:
Class class;
id object;
if(classNumber == 1)
{
//create ClassA
class = NSClassFromString(@"classA");
object = [[class alloc] init];
}
else if(classNumber == 2)
{
//create ClassB
class = NSClassFromString(@"classB");
object = [[class alloc] init];
}
else if(classNumber == 3)
{
//create ClassC
class = NSClassFromString(@"classC");
object = [[class alloc] init];
}
else
{
object = nil;
}
return object;
对于运行时版本,我将替换上面的内容并分别在上面的if-elseif-else
中使用:
Class class = objc_allocateClassPair([classA class], "mySubClass", 0);
...
Class class = objc_allocateClassPair([classB class], "mySubClass", 0);
...
Class class = objc_allocateClassPair([classC class], "mySubClass", 0);
...
两个版本都很顺利。但我必须#import
所有这些classX
。
鉴于这是一个类方法,只会被调用一次,我想知道是否存在一些创建类的聪明方法,而不必导入所有这些标题。
我理解答案很可能是“No”,因为编译器需要在编译时知道类及其方法签名。
但我的经验是,每当我说“好的时候,我想我会在这里推动一下。让我们解决现在似乎有用的事情”,有人会来,并会反驳我的满意“嘿,看看这里,有更好/更聪明的方法来做到这一点。这是可能的。”。所以我想我会问。
总结一下问题: 如果我们只需要创建一个类,就可以尽可能地最小化#import
需要导入的文件?或者是否有一些聪明的方法可以动态导入头文件?
答案 0 :(得分:1)
首先,我真的没有看到这一点。首先,您仍然需要将所有这些类的目标文件链接到最终的二进制文件中。因此,您无法通过使用反射和操作包含来最小化二进制大小。
因此,您只能尝试优化include语句的数量。它真的值得,只是删除几行代码?当然,您可以将所需的标头包含到新的头文件中,并且只包含该标头文件。那会把包括的数量减少到1.这值得吗?我不知道。