我一直在阅读,当符合NSCoding协议并实现像-encodeWithCoder:这样的方法,并使用ie编码对象时
[coder encodeObject:self.someObject forKey:kSomeConstantToIdentifyFields];
此常量用于跟踪该对象。所以稍后,在该常量的帮助下,相应的“字段”或其他任何内容可以再次映射到该对象(在本例中为属性)。
但是:当这样定义时,这个有趣的常数是不是实际上是一个随机值?
#define kSomeConstantToIdentifyFields @"fieldFooBar"
系统如何管理它以始终为该常量分配相同的值?或者我得到一些关于这个常数错误的东西?该值实际上是“fieldFooBar”而不是一些随机数吗?
答案 0 :(得分:4)
键是一个字符串 - 一个名称,如果你愿意的话 - 用于标识字典中的字段。在这种情况下,字典将被写入或从通过NSCoding协议创建的存档中读取。
当你定义这样的键时,它不一定是常数,因为它可以在某个时刻改变(但只是故意改变,而不是系统随机改变)。只要你不改变@“fieldFooBar”字符串,它就会在程序的整个生命周期中保持不变。
键定义如下,不是常量,而是能够标记编译器警告和错误,例如拼写错误。
如果你定义了一次密钥,然后通过它的预处理程序符号引用它,如果你误解了它,编译器会抛出一个错误,说它找不到那个符号。如果你每次只使用一个字符串,那么编译器就不会知道,也无法向你发出警告。然后你会自己试图找出你的字段没有被解码的原因 - 因为你要的是错误的密钥名称。
答案 1 :(得分:1)
在您的应用程序编译之前,会发生预编译过程。 #define key value
指令告诉预编译器“每当看到键时,将其替换为值”。这不仅仅是因为它们是常数;就像你自己在应用程序中编写@"fieldFooBar"
一样。
不自己做的原因是为了避免错误,我认为Jasarien在回答中给出了很好的解释。
答案 2 :(得分:1)
定义字符串常量的更好方法是使用
static NSString *kSomeConstantToIdentifyFields = @"fieldFooBar";
这对你有些记忆。另外,我认为isEqual:欺骗对象指针,所以将所有常量指向一个地方都是好的。
答案 3 :(得分:-1)
常量始终保持不变 值?
我相信这就是为什么他们被称为常数。 ; O)