3

NSArray の isEqual メソッドが 2 つの配列の要素を比較する方法は不明です。両方の配列に同一のオブジェクト (例: ==) が含まれているかどうかを確認しますか? それとも、オブジェクトで isEqual を使用して両方の配列の内容を比較しますか?

この方法に関するAppleのドキュメントは簡潔で不明確です。NSArray.m のソースも見つかりません。

4

4 に答える 4

7

最新の Cocoa ドキュメントには答えがありませんが、WebObjects 3.5 の NSArray ドキュメント までさかのぼると、次の gem が見つかります。

- (BOOL) isEqual:(id)anObject

レシーバーと anObject が等しい場合は YES を返します。それ以外の場合は NO を返します。YES の戻り値は、レシーバーと anObject が両方とも NSArray から継承するクラスのインスタンスであり、両方に同じオブジェクトが含まれていることを示します (isEqualToArray:メソッドによって決定されます)。

従来のドキュメント以外の答えに最も近いのは、Cocoa のコーディング ガイドラインでのオブジェクト比較に関するこの議論ですisEqual:isEqualToWhatever:

それでも、ドキュメントを明確にするためにバグを報告することをお勧めします。

于 2012-09-03T22:07:41.743 に答える
4

ドキュメントは明確です:

2 つの配列は、それぞれが同じ数のオブジェクトを保持し、各配列の特定のインデックスにあるオブジェクトが isEqual: テストを満たす場合、等しい内容を持ちます。

つまり、isEqual(でなく==) がオブジェクトの等価性をテストするために使用されます。

于 2012-09-03T13:43:21.163 に答える
2

Cocoa のすべてのオブジェクトは-isEqual:、デフォルトで比較されます。ただし、-isEqual:onのデフォルト バージョンはポインタ比較を行います。そのため、オブジェクトがそのメソッドとメソッドをNSObject適切に実装していない場合、単純にポインターを比較することになります。-isEqual:-hash

于 2012-09-03T13:42:40.377 に答える
1

こんな感じかも!? (ここに書いたので誤字脱字があるかもしれません)

if(![array1 isKindOfClass:[NSArray class]] || ![array2 isKindOfClass:[NSArray class]])
 return NO;

if(array1 == array2)
 return YES;

if(array1.count != array2.count)
 return NO;

for(int i =0; i<array1.count;i++)
 if(![array1[i] isEqual:array[i]])
  return NO;

return YES;
于 2012-09-04T08:00:10.170 に答える