nsobject isequal은 무엇이며 해시 기본 기능은 무엇입니까?
-
12-09-2019 - |
문제
데이터베이스 모델 클래스가 있습니다 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
함께.