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

Dou*_*ugW 10 c iphone cocoa objective-c

我看到很多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
Run Code Online (Sandbox Code Playgroud)

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

这是我的问题,我想:

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

Ben*_*tto 13

#defines在实现文件(.m)中,根据定义范围限定为它们所在的文件,因为没有其他人使用#include.m文件.(您确实需要在常见的头文件中仔细考虑这一点,您提到的范围问题是真实的,并且SO_QUESTION_2345197_NAMESPACE_YOUR_CONSTANTS_APPROPRIATELY.)

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


Tec*_*Zen 8

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

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

@implementation MyClass (KeyNames)

+ (NSString *) creationDate_Key{
    return @"creationDate";
} 
@end
Run Code Online (Sandbox Code Playgroud)

然后我用它像:

NSString *key=[MyClass creationDate_Key];
Run Code Online (Sandbox Code Playgroud)

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

  • 只是很好奇,当你这样做时,每次引用`creationDate_Key`时它是否在内存中创建一个新的`NSString`对象(`@"creationDate"`)? (2认同)