objective-c中局部常量的最佳实践

时间:2010-02-26 22:08:52

标签: iphone c objective-c cocoa

我看到很多Objective-c代码只是#defines它需要的局部常量,然后继续它的快乐方式。问题是,据我所知,#define没有作用域。其中许多都是Apple自己的示例代码。例如,在TableViewSuite示例5中,TimeZoneView.m中的drawRect函数包含以下块:

#define LEFT_COLUMN_OFFSET 10
#define LEFT_COLUMN_WIDTH 130

#define MIDDLE_COLUMN_OFFSET 140
#define MIDDLE_COLUMN_WIDTH 110

#define RIGHT_COLUMN_OFFSET 270

#define UPPER_ROW_TOP 8
#define LOWER_ROW_TOP 34

#define MAIN_FONT_SIZE 18
#define MIN_MAIN_FONT_SIZE 16
#define SECONDARY_FONT_SIZE 12
#define MIN_SECONDARY_FONT_SIZE 10

有什么理由我不明白这不是荒谬的危险吗?至少,我们不应该在函数末尾#undef这些常量吗?

我认为这是我的问题:

在您需要的文件中定义所需内容并在最后取消定义是更好的做法吗?或者你认为对这种类型的东西使用静态效果更好吗?使用静态consts是否有任何性能损失,或者编译器是否能够像#define一样有效地处理它们?

2 个答案:

答案 0 :(得分:13)

实现文件(.m)中的

#defines按定义范围限定在它们所在的文件中,因为没有其他人#include是.m文件。 (你想在公共头文件中仔细考虑这个问题,你提到的范围问题是真实的,SO_QUESTION_2345197_NAMESPACE_YOUR_CONSTANTS_APPROPRIATELY。)

对于您似乎要问的实现文件中的局部常量,#define编译效率更高,但在调试时没有得到符号。本地consts有这个好处,并且在某些情况下(字符串常量?可能?依赖)防止二进制中的常量数据重复,尽管在世界的这一点上,大小和编译效率(以及查找它们的运行时效率)基本上是噪音,除非你描述一些紧凑的循环,并发现它的问题。

答案 1 :(得分:8)

最近,我开始使用类方法来存储常量。我把它作为一个黑客来开始,将密钥名称存储在一个不起眼的巨大核心数据模型中。但是,它在代码和代码库创建和维护方面都被证明是相当有效的。我生成了一个类似的类别:

@interface MyClass (KeyNames)
+ (NSString *) creationDate_Key;
@end

@implementation MyClass (KeyNames)

+ (NSString *) creationDate_Key{
    return @"creationDate";
} 
@end

然后我就像使用它一样:

NSString *key=[MyClass creationDate_Key];

我有一个为我生成方法的脚本。整洁的事情是它们的范围,继承和比长定义更紧凑。如果我需要经常使用密钥,就像在循环中一样,如果效率成为一个问题,我只需将它停放在局部变量中。