0

我们有一个常量文件,并且希望能够为我们的应用程序添加白标签。

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

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

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

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

请记住,将有数百张这样的图像,此时它们是否都将加载到内存中?或者#define只是代码行的占位符,直到它们被调用才会运行?

谢谢

4

3 回答 3

2

"#define" 由编译器进行预处理,在编译之前,您的所有 kMPNavigationBarBackgroundImages 将被您的定义替换。它与运行时没有任何关系。

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

于 2013-02-13T11:44:26.813 回答
1

简而言之,您的最后陈述是正确的;#define在代码中引用它之前,不会评估构成部分的代码。

也许解决这个问题的更好方法是将所有这些资产放入字典中,如果他们愿意,“客户”可以选择将其换出。字典会将众所周知的名称映射到资产文件名。

使用#defines 的问题在于它依赖于客户将正确的代码放入定义中,这既乏味又容易出错,例如:

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

将导致不明显的编译警告。

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

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

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

于 2013-02-13T11:46:14.957 回答
1

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

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

然后在编译之前它会变成:

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

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

希望有帮助!

:)

于 2013-02-13T11:46:24.093 回答