我有一个自定义对象,包含几个NSString对象,一些int和一些bool。我正在使用NSKeyedArchiver将对象的副本存档到NSData对象中。
用户而不是对连接到IB接口的对象变量进行更改。
完成更改后,对象的新版本将存档到第二个NSData对象中。
使用
比较这两个对象[myNSData1 isEqualToData: myNSData2];
在大多数情况下,它运作得非常好,但有一个非常令人不安的情况:
让我们说对象的变量初始化如下:
NSString *myString = @"";
将对象存档到myNSData1后,我们调用了以下内容:
myString = [myNSTextField stringValue];
将myString记录到控制台会显示myString的值仍为
@""
因此没有改变价值。
我们现在将对象存档到myNSData2。
然而,在执行上面的比较语句时,它现在返回FALSE。如果@""的原始分配,它 ONLY 返回FALSE取而代之的是@""包含在textfield中的stringValue。
为什么会这样?
答案 0 :(得分:1)
查看这些字符串的类型(NSLog([myString className])
应该有效),因为NSString
是class cluster。我猜你会发现,其中一个字符串是NSCFString
,另一个是NSCFConstantString
。归档程序对类型信息进行编码,因此如果类型不同,NSData
也会不同。
我不会依赖NSData
个相同的对象。如果你想比较两者,你最好取消归档它们并使用isEqual:
。这样,你就可以完全控制。