iOS는 개체 내에서 가능한 인스턴스 변수에 직접 액세스

3144 단어
대상 밖에서 실례 변수에 접근할 때, 항상 속성을 통해 해야 한다.그러나 대상 내부에서 실례 변수에 접근할 때 어떻게 해야 합니까?
사실 저는 여러분들이 실례 변수를 읽을 때 직접 방문하는 형식을 사용하고 실례 변수를 설정할 때 속성을 통해 하는 것을 강력히 권장합니다.다음 범주를 살펴보십시오.
@interface WGPerson : NSObject
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;

- (NSString *)fullName;
- (void)setFullName:(NSString *)fullName;
@end

fullName 및 setFullName 두 가지 편리한 방법은 다음과 같습니다.
- (NSString *)fullName {
  return [NSString stringWithFormat:@"%@, %@", self.firstName, self.lastName];
}

- (void)setFullName:(NSString *)fullName {
  NSArray *components = [fullName componentsSeparateByString:@" "];
  self.firstName =  components[0];
  self.lastName = components[1];
}

fullName 가져오기 방법의 설정 방법에서, 우리는 '점 문법' 을 사용하여 접근 방법을 통해 관련 실례 변수에 접근합니다.이제 두 가지 방법을 재작성하여 액세스 방법 없이 인스턴스 변수에 직접 액세스하는 것으로 가정합니다.
- (NSString *)fullName {
  return [NSString stringWithFormat:@"%@, %@", _firstName, _lastName];
}

- (void)setFullName:(NSString *)fullName {
  NSArray *components = [fullName componentsSeparateByString:@" "];
  _firstName =  components[0];
  _lastName = components[1];
}

이 두 가지 쓰기 방법은 몇 가지 차이가 있다.
4
  • OC의'방법 발송'절차를 거치지 않기 때문에 실례 변수에 직접 접근하는 속도가 당연히 빠르다. 이런 상황에서 컴파일러가 생성한 코드는 셔틀버스 대상의 실례 변수의 메모리에 직접 접근한다

  • 4
  • 실례 변수에 직접 접근할 때'설정 방법'을 호출하지 않습니다. 이것은 관련 띠에 정의된'메모리 관리의 의미'를 돌아갑니다.예를 들어 ARC에서 copy로 선언된 속성에 직접 액세스하면 해당 속성은 복제되지 않으며 새 값만 유지되고 이전 값만 해제됩니다

  • 4
  • 실례 변수에 직접 접근하면'키 값 관찰자(KVO) 알림'을 터치하지 않습니다. 이렇게 하면 문제가 발생할 수 있는지의 여부는 구체적인 대상 행위에 달려 있습니다

  • 4
  • 속성으로 접근하면 이와 관련된 오류를 조사하는 데 도움이 된다. 왜냐하면'획득 방법'과'설정 방법'에서 이 속성 호출자와 방문 시기를 추적할 수 있기 때문이다

  • 이렇게 많이 말했는데 사실은 합리적인 절충 방법이 있다. 실례 변수를 쓸 때는 '설정 방법' 을 통해 하고, 실례 변수를 읽을 때는 직접 접근한다.이 방법은 읽기 작업 속도를 높일 뿐만 아니라 속성에 대한 쓰기 작업도 제어할 수 있다."설정 방법"을 통해 실례 변수를 써야 하는 이유입니다.가장 중요한 이유는 이렇게 하면 관련 속성의'메모리 관리의 의미'가 관철될 수 있다는 데 있다.그러나 이러한 방법을 사용하려면 몇 가지 문제에 주의해야 한다.
    초기화 방법에서 속성 값을 어떻게 설정해야 합니까?이런 상황을 종합하여 서술하려면 반드시 실례 변수에 직접 접근해야 한다.하위 클래스는'덮어쓰기'설정 방법을 사용할 수 있기 때문에 WGPerson에 WGSmithPerson이라는 하위 클래스가 있다고 가정하면 이 하위 클래스는'Smith'라는 성을 가진 사람을 전문적으로 나타낸다. 이 하위 클래스는lastName 속성에 대응하는 설정 방법을 덮어쓸 수 있다.
    -(void)setLastName:(NSString *)lastName {
      [super setLastName:lastName];
      if(![lastName isEqualToString:@"Smith"]) {
       [NSException raise:NSInvalidArgumentException format:@"Last name must be Smith"];
    }
    

    기본 클래스 WGperson의 기본 초기화 방법에서는 성을 빈 문자열로 설정할 수 있습니다. 이때 '설정 방법' 을 통해 사용하면 하위 클래스의 설정 방법으로 이상을 던질 수 있습니다. 그러나 일부 경우 초기화 방법에서 설정 방법을 사용해야 합니다. 초기화할 실례 변수가 초클래스에 표시되고 하위 클래스에서 이 실례 변수에 직접 접근할 수 없으면그럼 "설정 방법"을 호출해야 합니다.
    또 하나는 '타성 초기화' (게으름 피우기) 다.이 경우 "획득 방법"을 통해 속성에 접근해야 합니다.그렇지 않으면 실례 변수는 영원히 초기화할 수 없습니다.요약:
    대상에서 데이터를 읽을 때는 실례 변수를 통해 읽어야 하고, 데이터를 쓸 때는 속성을 통해 써야 한다.초기화 방법과 dealloc 방법에서는 항상 실례 변수를 통해 데이터를 직접 읽어야 한다. (일부 특수한 하위 클래스를 제외하고는)때때로 불활성 초기화 기술로 데이터를 설정하는데 이런 경우 속성을 통해 데이터를 읽어야 한다.
    Effective Objective-C 2.0 읽음

    좋은 웹페이지 즐겨찾기