Effective-Objc 52 tips

2079 단어

1. 대상이 같은지 아닌지를 판단하는 tip

  • isEqual or ==
  • NSString *foo = @"Badger 123";
    NSString *bar = [NSString stringWithFormat:@"Badger %i", 123]; 
    BOOL equalA = (foo == bar); //< equalA = NO
    BOOL equalB = [foo isEqual:bar]; //< equalB = YES
    BOOL equalC = [foo isEqualToString:bar]; //< equalC = YES
    
    

    isEqual 방법은 NSObject 프로토콜에서 유래한 것으로 때때로 등호가 해결할 수 없는 문제는 isEqual 방법을 다시 써서 사용자 정의로 실현할 수 있다.그 내부 원리는 각object의hash값을 계산하여 두 object가 같은지 아닌지를 판단하는 데 있다.
    - (NSUInteger)hash;
    

    한편,hash의 계산은 시간 소모 작업이기 때문에hash를 계산하지 않고 모든 대상의identifier 값을 계산함으로써 목적을 달성할 수 있다.물론class를 정의할 때identifier 속성을 추가하고 비교 방법을 추가해야 합니다
    @property NSUInteger identifier;
    

    2) 상등성 판단은 집합에 사용되는 작용을 알 수 있는 집합은 중복된 원소가 있는 것을 허용하지 않지만, 때로는 집합에 가변수 그룹을 추가하면 집합에 포함된 원소와 같은 상황이 발생할 수 있으므로 아래 코드를 참고한다.
    NSMutableSet *set = [NSMutableSet new];
    NSMutableArray *arrayA = [@[@1, @2] mutableCopy]; 
    [set addObject:arrayA];
    
    NSLog(@"set = %@", set); 
    // Output: set = {((1,2))}
    
    NSMutableArray *arrayB = [@[@1, @2] mutableCopy]; 
    [set addObject:arrayB];
    
    NSLog(@"set = %@", set);
    // Output: set = {((1,2))}
    

    위의 이런 방식으로 집합 중의 원소를 첨가하면 집합 중의 원소가 일치하는 상황이 나타나지 않는다는 것을 알 수 있다
    그런데 이렇게 하면 돼!
    NSMutableArray *arrayC = [@[@1] mutableCopy];
    [set addObject:arrayC];
    
    NSLog(@"set = %@", set);
    // Output: set = {((1),(1,2))}
    
     [arrayC addObject:@2]; 
     NSLog(@"set = %@", set);
    // Output: set = {((1,2),(1,2))}
    

    이렇게 하면 집합set에 두 개의 같은 원소가 존재하는 것을 실현할 수 있다.물론 이 문제는 다른 사고를 일으키기 위한 것이다. 우리는 집합에 같은 요소가 존재하는 것을 실현할 수 있지만 집합이 복사된 후에도 똑같이 원래를 유지할 수 없다. 물론 원래를 유지할 수 없다. 이것이 바로 우리가 집합 안에서 같은 비교 판단을 할 때 주의를 기울여야 하는 문제이다!
    1. 두 개의 object가 같은지 비교하려면 isEqual:hash 두 가지 방법을 실현하십시오
    2. 두 대상이 서로 같고 반드시 같은hash값을 함유한다.그러나 같은 해시 값을 함유한 두 대상은 반드시 같지 않다
    3. 비교 방법(예를 들어identifier)을 교묘하게 설계하여 모든 속성을 간단하고 직접적으로 비교하는 것보다 더 의미가 있다.
    4. 절대 유일성을 실현하기 위해hash방법은 복잡하게 설계할 수 있으나 성능을 고려하여hash충돌을 적당히 남겨두는 것도 필요하다

    좋은 웹페이지 즐겨찾기