我们有一个常量文件,并且希望能够为我们的应用程序添加白标签。
白色标签的一部分是定义可以由我们的客户交换的图像。
定义所有这些图像的开销是多少?
例如#define kMPNavigationBarBackgroundImage [UIImage imageNamed:@"nav_bar"]
是否值得NSString为图像名称定义常量?或者这样会好吗?
请记住,将有数百张这样的图像,此时它们是否都将加载到内存中?或者#define只是代码行的占位符,直到它们被调用才会运行?
谢谢
我们有一个常量文件,并且希望能够为我们的应用程序添加白标签。
白色标签的一部分是定义可以由我们的客户交换的图像。
定义所有这些图像的开销是多少?
例如#define kMPNavigationBarBackgroundImage [UIImage imageNamed:@"nav_bar"]
是否值得NSString为图像名称定义常量?或者这样会好吗?
请记住,将有数百张这样的图像,此时它们是否都将加载到内存中?或者#define只是代码行的占位符,直到它们被调用才会运行?
谢谢
"#define" 由编译器进行预处理,在编译之前,您的所有 kMPNavigationBarBackgroundImages 将被您的定义替换。它与运行时没有任何关系。
简而言之,您的最后陈述是正确的;#define在代码中引用它之前,不会评估构成部分的代码。
也许解决这个问题的更好方法是将所有这些资产放入字典中,如果他们愿意,“客户”可以选择将其换出。字典会将众所周知的名称映射到资产文件名。
使用#defines 的问题在于它依赖于客户将正确的代码放入定义中,这既乏味又容易出错,例如:
// (Missing end quote)
#define kMPNavigationBarBackgroundImage [UIImage imageNamed:@"nav_bar]
将导致不明显的编译警告。
一种更优雅的方法是提供一种方法(在某处),您只需提供众所周知的名称:
- (UIImage *)imageWithWellKnownName:(NSString *)wellKnownName;
它查找资产文件名并加载它,如果无法加载文件,则抛出异常。
当您使用#define 定义某种常量时,它只是一个预处理器指令,告诉它替换代码中定义的文本。因此,如果您使用:
#define image [UIImage imageNamed:@"name"];
UIImage *myImage = image;
然后在编译之前它会变成:
UIImage *myImage = [UIImage imageNamed:@"name"];
它只是在您使用它的任何地方被替换。
希望有帮助!
:)