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有这个好处,并且在某些情况下(字符串常量?可能?依赖)防止二进制中的常量数据重复,尽管在世界的这一点上,大小和编译效率(以及查找它们的运行时效率)基本上是噪音,除非你描述一些紧凑的循环,并发现它的问题.
最近,我开始使用类方法来存储常量.我把它作为一个黑客来开始,将密钥名称存储在一个不起眼的巨大核心数据模型中.但是,它在代码和代码库创建和维护方面都被证明是相当有效的.我生成一个类似的类别:
@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)
我有一个脚本,为我生成方法.整洁的事情是它们的范围,继承和比长定义更紧凑.如果我需要经常使用密钥,就像在循环中一样,如果效率成为一个问题,我只需将它停放在局部变量中.
| 归档时间: |
|
| 查看次数: |
3846 次 |
| 最近记录: |