Effective Objective-C 2.0 독서 노트(3)

2502 단어

5. 대상 내부에서 가능한 한 실례 변수에 직접 접근


1. "속성에 의한 접근"과 "직접 접근"실례 변수의 차이
  • Objective-C의'방법 발송'절차를 거치지 않기 때문에 실례 변수에 직접 접근하는 속도가 비교적 빠르다.이러한 상황에서 컴파일러는 생성된 코드가 저장 대상의 실례 변수의 메모리에 직접 접근할 것이라고 말한다
  • 실례 변수에 직접 접근할 때'설정 방법'을 사용하지 않습니다. 이것은 관련 속성에 정의된'메모리 관리의 의미'를 돌아갑니다.예를 들어 ARC에서 copy로 성명된 속성에 직접 접근하면 속성을 복사하지 않고 새 값만 보존하고 옛 값만 방출합니다.
  • 인스턴스 변수에 직접 액세스하면 키 값 관측(KVO) 알림이 트리거되지 않습니다.이렇게 하면 문제가 생길지 안 생길지는 구체적인 대상 행위에 달려 있다.
  • 속성으로 접근하면 이와 관련된 오류를 조사하는 데 도움이 된다. 왜냐하면'획득 방법'과'설정 방법'에'단점'을 추가하여 이 속성의 호출자와 방문 시기를 감시할 수 있기 때문이다.

  • 2. 솔루션
    인스턴스 변수를 쓸 때는 [설정 방법]을 사용하고, 인스턴스 변수를 읽을 때는 직접 액세스합니다.이 방법은 읽기 작업의 속도를 높일 수 있을 뿐만 아니라 속성에 대한 쓰기 작업도 제어할 수 있다.'설정 방법'을 통해 실례 변수를 써야 하는 이유는 이렇게 하면 관련 속성의'메모리 관리 의미'가 관철될 수 있기 때문이다.
    3. 주의
  • 초기화 방법에서 실례 변수에 직접 접근해야 한다. 왜냐하면 하위 클래스가'복제'(override) 설정 방법을 사용할 수 있기 때문이다.
  • EOCPerson.h
    @interface EOCPerson : NSObject
    @property (nonatomic,copy) NSString *firstName;
    @property (nonatomic,copy) NSString *lastName;
    - (id)initWithFirstName:(NSString *)firstName
                   lastName:(NSString *)lastName;
    @end
    
    EOCSmithPerson.m
    @implementation EOCSmithPerson
    - (void)setLastName:(NSString *)lastName {
      if (![lastName isEqualToString:@"Smith"]) {
        [NSException raise:NSInvalidArgumentException format:@"Last name must be Smith"];
      }
      self.lastName = lastName;
    }
    @end
    

    EOCSmithPerson은 EOCPerson의 하위 클래스로 Smith라는 성을 가진 사람이 EOCSmithPerson에 lastName의 설정 방법을 덮어썼다. 만약에 이때 EOCPerson의 기본 초기화 방법에서 속성 접근 실례 변수를 사용한다면 하위 클래스 덮어쓰기 설정 방법을 호출할 것이다.만약 우리가 성을 Smith 이외의 값으로 설정한다면, 여기는if문장에 들어가서 이상을 던질 것입니다.
  • 초기화되어야 하는 실례 변수가 초클래스 (부클래스) 에 있고, 하위 클래스에서 이 실례 변수에 직접 접근할 수 없다면 설정 방법을 호출해야 합니다.
  • '타성 초기화'(게으름 피우기)를 사용할 때'획득 방법으로 속성에 접근해야 합니다. 그렇지 않으면 실례 변수는 영원히 초기화되지 않습니다'
  • 6.'대상 등동성'이라는 개념 이해

  • 대상의 등동성을 측정하려면 "isEqual:"과hash방법을 제공해야 한다.
  • 같은 대상은 반드시 같은 해시 코드를 가져야 하지만 두 해시 코드가 같은 대상은 반드시 같지 않다.이 말은hash코드의 특징을 묘사한다. 우리가hash방법을 다시 쓰고hash값을 되돌릴 때 되돌려값이 상기 요구를 충족시켜야 한다
  • 모든 속성을 맹목적으로 검측하지 말고 구체적인 수요에 따라 검측 방안을 제정해야 한다.예를 들어 하나의 클래스의 실례가 데이터베이스에 있는 데이터에 따라 생성된 경우 이 대상의 모든 속성은 읽기만 하고 하나의 속성은'유일한 표지'로 데이터베이스에 있는 메인 키를 대표한다. 이때 우리가 이 클래스의 실례가 같은지 아닌지를 판단할 때 모든 속성이 같은지 하나하나 판단하지 않고'유일한 표지'의 속성만 판단하면 된다
  • hash방법을 작성할 때 계산 속도가 빠르고hash코드 충돌 확률이 낮은 알고리즘을 사용해야 한다.iOS 판단 대상 동일
  • 좋은 웹페이지 즐겨찾기