2014-03-26 49 views
0

我只是想出了一個簡單的場景,讓我自己去練習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

由於這是一個類方法,只會被調用一次,我不知道是否存在一些聰明的方法來創建一個類,而無需導入所有這些標題。

我知道答案很可能是「否」,因爲編譯器需要在編譯時知道該類及其方法簽名。

但我的經驗是,每當我說「好吧,我想我在這裏推了一下。讓我們解決什麼似乎現在的工作」,有人會出現並會說「嘿反駁我滿意,看看這裏,有一個更好/更聰明的方法來做到這一點,這是可能的。「。所以我想我會問。

要總結問題:,纔有可能最大限度地減少#import荷蘭國際集團儘可能多的,如果我們只需要創建需要要導入的文件中的一個類?還是有一些聰明的方法可以動態地導入一個頭文件?

回答

1

首先,我真的沒有看到這一點。首先,您仍然需要將所有這些類的對象文件鏈接到最終的二進制文件中。所以你不能通過使用反射和操縱你的包含來最小化二進制大小。

因此,您只能嘗試優化包含語句的數量。它真的值得嗎,只需要刪除幾行代碼?當然,你可以將所需的頭文件包含到一個新的頭文件中,並且只包含該頭文件。這會將包含的數量減少到1.這是否值得麻煩?我不知道。