1

NSMutableArrayを使用して問題に直面しています。空のmutableArrayをNSMutableArrayに追加するという要件に遭遇しました。最後の配列を削除すると、以前に追加したすべての配列も親配列から削除されました。ここにコード、

NSMutableArray *collections = [[NSMutableArray alloc] init];

NSMutableArray *bookSet1 = [[NSMutableArray alloc] init];
[collections addObject:bookSet1];

NSMutableArray *bookSet2 = [[NSMutableArray alloc] init];
[collections addObject:bookSet2];

NSLog(@"bookSet1==bookSet2 %d", bookSet1==bookSet2);

[collections removeObject:bookSet2];

NSLog(@"Collections count==%d", [collections count]);

結果

ArrayTest [2356:c07] bookSet1 == bookSet2 0 ArrayTest [2356:c07]コレクション数== 0

それらが同じ参照を持っているかどうかを確認しましたが、equalsメソッドがfalseを返したため、同じメモリ位置を確実に指していません。なぜこのような振る舞いなのかわからない。これを克服するための可能な解決策。

4

2 に答える 2

9

それらが同じ参照を持っているかどうかをチェックしましたが、equalsメソッドがfalseを返しました

いや。を使用して同等性をチェックしていませんでしたisEqual。もしあなたがを使っていたら、あなたは(すなわち)isEqual:を得ていただろう。1YES

NSMutableArray(およびすべての基本的なCocoaコレクションクラス)isEqual:は、2つのオブジェクトが同じであるかどうかを判断するために使用します。このメソッドはオーバーライドでき、メモリアドレスが同一である場合だけでなく、コンテンツが概念的に同じであると見なされる場合にオブジェクトを同等に比較するためによく使用されます(後者が真の場合、文字列やそのようなオブジェクトを比較できませんでした)安全に、例えば)。

これは、の予想される概念的に正しい動作であるため、これを実際に克服することはできませんremoveObject:。何らかの理由でうまくいかない場合はremoveObjectIdenticalTo:、比較のためにメモリアドレスを使用するメソッドをいつでも使用できます(ドキュメントはこちら)。

于 2013-03-14T15:10:13.087 に答える
0
  1. removeObject: 一致は、isEqual:メッセージに対するオブジェクトの応答に基づいて決定されます。つまり、コンテンツが同じである場合、オブジェクトは同一であると見なされます。

  2. removeObjectIdenticalTo: 一致は、オブジェクトアドレスを使用して決定されます。つまり、オブジェクトアドレスが同じである場合、オブジェクトは同一であると見なされます。

試す

[collections removeObjectIdenticalTo:bookSet2];

これにより、アドレスに基づいて削除するオブジェクトが正確に削除されます。

于 2013-03-14T15:48:43.263 に答える