存档的NSData,isEqualToData:和Empty Strings

时间:2012-05-23 02:55:52

标签: xcode cocoa nsstring nsdata nstextfield

我有一个自定义对象,包含几个NSString对象,一些int和一些bool。我正在使用NSKeyedArchiver将对象的副本存档到NSData对象中。

用户而不是对连接到IB接口的对象变量进行更改。

完成更改后,对象的新版本将存档到第二个NSData对象中。

使用

比较这两个对象
[myNSData1 isEqualToData: myNSData2];

在大多数情况下,它运作得非常好,但有一个非常令人不安的情况:

让我们说对象的变量初始化如下:

NSString *myString = @"";

将对象存档到myNSData1后,我们调用了以下内容:

myString = [myNSTextField stringValue];

将myString记录到控制台会显示myString的值仍为

@""

因此没有改变价值。

我们现在将对象存档到myNSData2。

然而,在执行上面的比较语句时,它现在返回FALSE。如果@""的原始分配,它 ONLY 返回FALSE取而代之的是@""包含在textfield中的stringValue。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

查看这些字符串的类型(NSLog([myString className])应该有效),因为NSStringclass cluster。我猜你会发现,其中一个字符串是NSCFString,另一个是NSCFConstantString。归档程序对类型信息进行编码,因此如果类型不同,NSData也会不同。

我不会依赖NSData个相同的对象。如果你想比较两者,你最好取消归档它们并使用isEqual:。这样,你就可以完全控制。