我们有一个常量文件,希望能够将我们的应用程序白标。
白色标签的一部分是定义可由我们的客户交换的图像。
定义所有这些图像的开销是多少?
e.g。 #define kMPNavigationBarBackgroundImage [UIImage imageNamed:@"nav_bar"]
为图像名称定义NSString
常量是否值得?或者这样可以吗?
请记住,这些图像会有数百个,它们是否会在此时加载到内存中?或者#define
只是代码行的掌控者,在调用它们之前不会运行?
由于
答案 0 :(得分:2)
“#define”由编译器预处理,在编译开始之前,所有kMPNavigationBarBackgroundImages都将被您的定义所取代。它与运行时没有任何关系。
答案 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"];
它会在您使用它的任何地方被替换。
希望有所帮助!
:)