2013-02-13 77 views
0

我們有一個常量文件,並希望能夠對我們的應用程序進行白色標記。有什麼開銷#定義對象?

部分白色標籤定義了可由我們的客戶交換的圖像。

定義所有這些圖像的開銷是多少?

例如#define kMPNavigationBarBackgroundImage [UIImage imageNamed:@"nav_bar"]

是否值得爲圖像名稱定義NSString常量?或者這會好嗎?

請記住,這些圖像會有數百個,他們是否都會加載到內存中?或者#define只是一行代碼,它們在被調用之前不會運行?

感謝

回答

2

「的#define」是由編譯器預處理,編譯發生在所有的kMPNavigationBarBackgroundImages之前將您的定義所取代。它與運行時沒有任何關係。

http://www.cplusplus.com/doc/tutorial/preprocessor/

+0

太棒了! :)所以這絕對沒有開銷。 :) – 2013-02-13 11:46:02

+0

不,沒有 – guenis 2013-02-13 11:47:42

1

好,總之,你最後的說法是正確的;構成#define的一部分的代碼只有在代碼中被引用之後纔會被評估。

也許更好的方法是將所有這些Assets放入一個字典中,如果他們願意,可以由「客戶端」選擇性地換出。字典會將知名的名稱映射到資產文件名。

使用#define S上的問題是,它依賴於客戶把正確的代碼的定義,這是繁瑣且容易出錯,例如:

// (Missing end quote) 
#define kMPNavigationBarBackgroundImage [UIImage imageNamed:@"nav_bar] 

會導致非顯而易見編譯警告。

一個更優雅的辦法是提供一個方法(的地方),您只需提供衆所周知名

- (UIImage *)imageWithWellKnownName:(NSString *)wellKnownName; 

它看起來行動的資源文件名,並加載它,拋出如有異常該文件無法加載。

1

當您使用#define定義某種常量時,它只是一個預處理器指令,用於指示它替換代碼中定義的文本。 所以如果你使用:

#define image [UIImage imageNamed:@"name"]; 
UIImage *myImage = image; 

然後編譯之前它會被改爲:

UIImage *myImage = [UIImage imageNamed:@"name"]; 

它只是可以隨時隨地,你用它代替。

希望有幫助!

:)