iOS - 개체 동성 이해

2024 단어

전언


'등동성'에 따라 대상을 비교하는 것은 매우 유용한 기능이다.그러나 ==조작부호에 따라 비교한 결과가 반드시 우리가 원하는 것은 아니다. 왜냐하면 이 조작이 비교한 것은 두 개의 바늘 자체이지 그가 가리키는 대상이 아니기 때문이다.NSOject 프로토콜에 명시된 "isEqual"방법을 사용하여 두 객체의 동일성을 판단해야 합니다.일반적으로 두 유형의 서로 다른 대상은 항상 같지 않다.다음 예:
NSString *test1 = @"test";

NSString *test2 = [NSString stringWithFormat:@"%@",@"test"];

BOOL boolA = (test1 == test2); // NO

BOOL boolB = [test1 isEqual:test1]; // YES

BOOL boolC = [test1 isEqualToString:test2]; // YES

예에서 볼 수 있듯이 ==등동성 판단 방법과 차이점을 보면 NSString은 스스로 등동성 판단 방법을 실현했다. 이름은'isEqual Tostring:'이다.

NSOject 프로토콜에는 동일성을 판단하기 위한 두 가지 주요 방법이 있습니다.


//두 대상이 동일한지 판단(규칙을 사용자 정의할 수 있음)
  • (BOOL)isEqual:(id)object ;
  • (NSUInteger)hash ; NSOject 클래스는 두 가지 메서드에 대해 기본적으로 메모리 주소가 동일할 때만 객체가 동일합니다.우리는 위의 방법을 덮어써서 연결 대상이 같은지 아닌지를 스스로 판단할 수 있다.예를 들어 아래 종류
  • @interface Person : NSObject
    
    @property (nonatomic,copy) NSString*firstName;
    
    @property (nonatomic,copy) NSString*lastName;
    
    @property (nonatomic,assign) NSUInteger age;
    @end
    

    만약 내가 비교하는 규칙이 Person의 모든 필드가 같다면, 이 두 대상은 같다.
    - (BOOL)isEqual:(id)object {
    
    if (self == object) {
        
        return YES;
    }
    if ([self class] != [object class]) {
        
        return NO;
    }
    Person *p = (Person*)object;
    
    if (![_firstName isEqualToString:p.firstName]) {
        
        return NO;
    }
    if (![_lastName isEqualToString:p.lastName]) {
        return NO;
    }
    if (_age!=p.age) {
        return NO;
    }
    return YES;
    }
    
    - (NSUInteger)hash {
    
    //       return 3122;
    
    //       
    //    NSString *stringToHash = [NSString stringWithFormat:@"%@:%@:%i",_firstName,_lastName,_age];
      //    
        //    return [stringToHash hash];
    
      //       (  ,       ,              ,         )
      NSUInteger fistNameHash = [_firstName hash];
      NSUInteger lastNameHash = [_lastName hash];
      NSUInteger ageHash = _age;
      return fistNameHash^lastNameHash^ageHash;
    
    }
    

    또한 우리는 자신의 수요에 따라 규칙을 정하지 못해 두 대상이 같은지 아닌지를 판단할 수 있다.

    좋은 웹페이지 즐겨찾기