문제

데이터베이스 모델 클래스가 있습니다 NSObject. 이 개체 세트가 있습니다 NSMutableArray. 나는 사용한다 indexOfObject: 성냥을 찾으려면. 문제는 모델 객체의 메모리 주소 변경입니다. 그래서 나는 그것을 우선하고있다 hash 모델의 행 ID를 반환하는 메소드. 그러나 이것은 그것을 고칠 수 없습니다. 나는 또한 그것을 무시해야한다 isEqual: 메소드의 값을 비교하는 방법 hash 방법.

무엇을합니까 isEqual: 기본적으로 평등을 결정하는 데 사용되는 방법?

메모리 주소를 사용한다고 가정합니다. 읽은 후 isEqual: 문서화는 그것이 값을 사용했다고 생각했습니다 hash 방법. 분명히, 그 값을 무시하려는 시도가 나의 초기 문제를 해결하지 못했기 때문에 그렇지 않습니다.

도움이 되었습니까?

해결책

올바르게 추측 한대로 NSObject기본값 isEqual: 동작은 객체의 메모리 주소를 비교하는 것입니다. 이상하게도, 이것은 현재 문서화되어 있지 않습니다 nsObject 클래스 참조, 그러나 그것은 문서화되어 있습니다 내성 문서화 :

기본값 NSObject 구현 isEqual: 포인터 평등을 확인합니다.

물론, 의심 할 여지없이, 서브 클래스는 NSObject 무시할 수 있습니다 isEqual: 다르게 행동합니다. 예를 들어, NSString'에스 isEqual: 방법, 다른 방법을 통과했을 때 NSString, 먼저 주소를 확인한 다음 문자열 사이의 정확한 문자 일치를 확인합니다.

다른 팁

기본 구현에 대한 답 isEqual: 포괄적입니다. 그래서 기본 구현에 대한 메모를 추가합니다. hash. 여기있어:

-(unsigned)hash {return (unsigned)self;}

즉, 그것은 사용되는 것과 동일한 포인터 값입니다. isEqual:. 다음은 이것을 확인하는 방법입니다.

NSObject *obj = [[NSObject alloc] init];
NSLog(@"obj: %@",obj);
NSLog(@"hash: %x",obj.hash);

결과는 다음과 같습니다.

obj: <NSObject: 0x16d44010>
hash: 16d44010

친애하는.

iOS 8의 BTW hash 방법이 아닌 재산이되었지만 거기에 있습니다.

나는 그것을 가정 할 것이다 NSObject isEquals 사용 == 운영자 및 hash 메모리 주소를 사용합니다.

isEquals 메소드는 절대 사용해서는 안됩니다 hash 평등에 대한 절대 테스트로. 두 개의 객체가 비슷한 것으로 보장됩니다 hashCode, 충분한 객체를 검색하면 hash).

다시 말해, hash 다음 사양이 필요합니다. 두 객체가 동일하면 hash 평등해야합니다. 그러나 두 객체가 hash 값은 동일하며 반드시 같을 필요는 없습니다.

팁으로, 당신은 항상 무시해야합니다 isEquals 그리고 hashCode 함께.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top