在Objective-C中使用const来声明不要更改的值有什​​么必要?

Dou*_*ith 1 const objective-c

我已经#define在我的.m文件中使用了一段时间了,我最近发现它不是优选的,你应该使用它const.但是,有很多关于使用那些变化很大的信息的信息,我想确保我正确使用它们.

对于我#define的,我只是在我的.m中使用它们,因为我没有看到任何理由让它们公开.但在大多数情况下,似乎在.h中使用externFOUNDATION_EXPORT之前声明了.

在标题中这样做是好的做法吗?或者在实施中这样做是否可以?

还有static必要吗?

const来的类型之前,像NSString * constconst NSString *

是否有一个公认的标准,如何命名他们?似乎有很多相互矛盾的信念,因为有些人坚持使用前置k,有些人使用三个字母常量,有些人根本不使用,有些人使用骆驼案例,以大写字母开头.

Ken*_*ses 6

如果它是公共的 - 类或模块接口的一部分 - 那么声明应该在标题中.但是,定义应该在实现中.

指定static给出符号内部链接.您应该将它用于私人符号,但不得将其用于公共符号.

NSString * constconst NSString *指两种不同的东西.第一个是指向a的常量指针NSString.第二个是指向常量的指针NSString.虽然它有点不直观,但你应该使用前者.

肯定希望指针是恒定的.你不希望有人能够分配指针,使它指向不同的东西.

你可能也希望你也希望它也是NSString恒定的(即const NSString * const),但这不是一个好主意.首先,既然NSString已经不可变,那就没必要了.没有人能够改变NSString对象的内容.除此之外,a NSString可能仍会随着时间的推移改变其内部状态,而不会改变其价值.例如,它可能会缓存特定编码中的表示.(NSString文字实际上并没有这样做,但你不想排除它.)

至于命名约定,这是一个风格问题,而不是真正可以肯定回答的问题.

最后,对于整数常量,您应该考虑使用枚举而不是const变量.枚举的元件可以用作真实编译时间常数,如在caseswitch语句.