0

我有一个自定义对象,其中包含几个 NSString 对象、一些整数和一些布尔值。我正在使用 NSKeyedArchiver 将对象的副本存档到 NSData 对象中。

然后,用户对连接到 IB 接口的对象变量进行更改。

进行更改后,对象的新版本将归档到第二个 NSData 对象中。

这两个对象使用比较

[myNSData1 isEqualToData: myNSData2];

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

假设对象有一个变量初始化如下:

NSString *myString = @"";

在对象被归档到 myNSData1 之后,我们调用了以下代码:

myString = [myNSTextField stringValue];

将 myString 记录到控制台显示 myString 的值仍然是

@""

因此没有改变价值。

我们现在将对象归档到 myNSData2 中。

然而,在执行上面的比较语句后,它现在返回 FALSE。当使用 stringValue 将 @"" 的原始分配替换为包含在文本字段中的 @"" 时,它才返回 FALSE 。

为什么是这样?

4

1 回答 1

1

看看这些字符串的类型(NSLog([myString className])应该可以),因为NSString它是一个类簇。我猜你会发现,其中一个字符串是 an NSCFString,另一个是NSCFConstantString. 归档器对类型信息进行编码,因此如果类型不同,则它们NSData也会不同。

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

于 2012-05-23T03:30:37.500 回答