最小化标头导入

时间:2014-03-26 17:14:20

标签: ios objective-c objective-c-runtime

我刚想到了一个简单的场景,让我自己来玩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需要导入的文件?或者是否有一些聪明的方法可以动态导入头文件?

1 个答案:

答案 0 :(得分:1)

首先,我真的没有看到这一点。首先,您仍然需要将所有这些类的目标文件链接到最终的二进制文件中。因此,您无法通过使用反射和操作包含来最小化二进制大小。

因此,您只能尝试优化include语句的数量。它真的值得,只是删除几行代码?当然,您可以将所需的标头包含到新的头文件中,并且只包含该标头文件。那会把包括的数量减少到1.这值得吗?我不知道。