0

いくつかの NSString オブジェクト、いくつかの int、いくつかの bool を含むカスタム オブジェクトがあります。NSKeyedArchiver を使用して、オブジェクトのコピーを NSData オブジェクトにアーカイブしています。

ユーザーは、IB インターフェイスに接続されているオブジェクト変数を変更します。

変更が行われた後、オブジェクトの新しいバージョンが 2 番目の NSData オブジェクトにアーカイブされます。

これらの 2 つのオブジェクトは、次を使用して比較されます。

[myNSData1 isEqualToData: myNSData2];

ほとんどの場合、問題なく動作しますが、非常に厄介な状況が 1 つあります。

オブジェクトに次のように初期化された変数があるとします。

NSString *myString = @"";

オブジェクトが myNSData1 にアーカイブされた後、以下を呼び出しました。

myString = [myNSTextField stringValue];

myString をコンソールに記録すると、myString の値がまだ

@""

したがって、値は変更されていません。

オブジェクトを myNSData2 にアーカイブします。

ただし、上記の比較ステートメントを実行すると、FALSE が返されるようになりました。@"" の元の割り当てが、stringValue を使用してテキストフィールドに含まれる @"" に置き換えられた場合にのみ、FALSE を返します。

どうしてこれなの?

4

1 に答える 1

1

クラス clusterであるため、これらの文字列のタイプを確認してください (NSLog([myString className])動作するはずです) 。あなたはそれを見つけると思います.それらの文字列の1つは であり、もう1つは. アーカイバーは型情報をエンコードするため、型が異なればも異なります。NSStringNSCFStringNSCFConstantStringNSData

NSDataオブジェクトが同一であることに依存しません。2 つを比較したい場合は、アーカイブを解除してisEqual:. そうすれば、完全に制御できます。

于 2012-05-23T03:30:37.500 に答える