#defining对象有什么开销?

时间:2013-02-13 11:38:35

标签: ios objective-c

我们有一个常量文件,希望能够将我们的应用程序白标。

白色标签的一部分是定义可由我们的客户交换的图像。

定义所有这些图像的开销是多少?

e.g。 #define kMPNavigationBarBackgroundImage [UIImage imageNamed:@"nav_bar"]

为图像名称定义NSString常量是否值得?或者这样可以吗?

请记住,这些图像会有数百个,它们是否会在此时加载到内存中?或者#define只是代码行的掌控者,在调用它们之前不会运行?

由于

3 个答案:

答案 0 :(得分:2)

“#define”由编译器预处理,在编译开始之前,所有kMPNavigationBarBackgroundImages都将被您的定义所取代。它与运行时没有任何关系。

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

答案 1 :(得分:1)

总之,你的最后陈述是正确的;构成#define一部分的代码在代码中被引用之前不会被评估。

或许更好的方法是将所有这些 Assets 放入一个字典中,如果他们愿意,可以选择由“客户端”替换掉。字典会将众所周知的名称映射到资产文件名。

使用#define的问题在于它依赖于客户在定义中放置正确的代码,这很乏味且容易出错,例如:

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

会导致非明显的编译警告。

更优雅的方法是提供一种方法(某处),只需提供众所周知的名称

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

查找资产文件名并加载它,如果无法加载文件则抛出异常。

答案 2 :(得分:1)

当你使用#define来定义某种常量时,它只是一个预处理器指令来告诉它替换代码中定义的文本。 所以如果你使用:

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

然后在编译之前它将变为:

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

它会在您使用它的任何地方被替换。

希望有所帮助!

:)