이들은 C 배열 또는 C++ 벡터가 아닌 Cocoa 배열 개체 (NSArray의 인스턴스)이며 Objective-C에는 연산자 오버로드가 없음을 기억하십시오. 개체로 수행 할 수있는 유일한 작업은 변수를 전달하고 변수에 저장 한 다음 메시지를 보내는 것입니다.
따라서 배열 - 아래 첨자 연산자는 Objective-C 객체에 잘못되었습니다. Objective-C 객체에 대한 포인터를 역 참조하는 것이 언어 적으로 유효하다고 생각하지 않습니다. 따라서이 코드는 컴파일러 오류를 제공해야합니다. 그래도 나는 잘못 생각할지도 모른다. 런타임으로 만들면 조만간 배열 오브젝트의 끝을 넘어 메모리에 액세스하므로 코드가 조만간 충돌합니다.
(2013 년부터 편집 : Objective-C는 이제 객체의 첨자를 지원합니다.) 궁극적으로 적절한 objectAtIndex:
또는 replaceObjectAtIndex:withObject:
메시지로 변환됩니다. 그래도 문제의 코드는 실제로 작동하지만 아직 올바른 방법은 아닙니다. 단순히 배열을 걸 으면 훨씬 적은 두 배열을 비교할 수 있습니다.
[myArray objectAtIndex:i]
적절한 방식 :)
색인하여 NSArray를 개체에서 객체를 검색하는 적절한 방법은 배열 첨자 연산자를 사용하는 것이 아니라 어레이의 objectAtIndex:
메시지 오브젝트 보내 아니다 배열 객체의 요소를 반복 할 때 (가변 배열의 객체를 대체하는 것과 같이) 다른 것을위한 색인이 필요 없다고 가정하면 직접 루프하는 것입니다 ("빠른 열거"라고 함) :
for (MyObject *myObject in myArray) {
…
}
NSArray도 응답합니다. s를 objectEnumerator
및 reverseObjectEnumerator
으로 변경하여 유사한 반복 가능한 객체를 반환합니다. 이 두 가지 중에서 reverseObjectEnumerator
은 새 코드에서 더 유용합니다. 배열에서 직접 반복하여 앞으로 반복 할 수 있기 때문입니다. 빠른 열거 형이 존재하기 전에 둘 다 가장 유용했습니다. 그 코드는 다음과 같이 보았다 :
NSEnumerator *myArrayEnum = [myArray objectEnumerator];
MyObject *myObject;
while ((myObject = [myArrayEnum nextObject])) {
…
}
(예, 그 조건에 할당의 고의적 따라서 추가
()
우리는, 당시 대담하게 코딩 우리를하지 않았다..?) 당신이 무엇을 위해
' 하고 재 Williham Totland 제안으로,하지만 당신은 더 많은 가능성이 배열 중 하나에게 isEqualToArray:
메시지를 보낼 :
BOOL theyAreEqual = [myFirstArray isEqualToArray:mySecondArray];
이 두 배열 한 다음, 같은 길이가 잠금 단계에서 둘 다 걸어 확인한다 , isEqual:
에게 개체의 각 쌍. 모든 isEqual:
메시지가 반환 된 경우 YES
을 반환합니다. YES
; 그렇지 않으면 NO
입니다. 배열에는 다른 객체가 포함될 수 있지만 각 쌍이 동일하면 배열 자체가 동일합니다.
개체 평등을 원한다고 가정합니다. 두 개의 개별 오브젝트는 메시지를 보내고 다른 오브젝트를 전달할 때 그 중 하나가 YES
으로 응답하면 동등합니다. 당신이 개체의 ID를 비교하는 의미 경우에, 당신은 잠금 단계 루프를 직접 할 필요 ==
를 사용합니까 :
BOOL arraysContainTheSameObjects = YES;
NSEnumerator *otherEnum = [otherArray objectEnumerator];
for (MyObject *myObject in myArray) {
if (myObject != [otherEnum nextObject]) {
//We have found a pair of two different objects.
arraysContainTheSameObjects = NO;
break;
}
}
을하지만 그 확률이 낮다. 대다수의 시간 동안, 나는 객체의 평등성이 아닌 정체성을 테스트하기를 원했습니다. 따라서 isEqualToArray:
은 제가 원했던 것입니다.
+1 사람에게 물고기를 가르치기 위해 +1. – willc2
임의의 후속 질문 :'[nsArrrayInstance isEqual : otherInstance]'는 [nsArrrayInstance isEqualToArray : otherInstance]'와 동일합니까? – nmr
@nmr : 거의. 두 경우의 차이점은 다음과 같습니다. http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/FrameworkImpl.html#//apple_ref/doc/uid/20001286-1007347 http :// /developer.apple.CocoaObjects/CocoaObjects/CocoaObjects.html # // apple_ref/doc/uid/TP40002974-CH4-SW61 –