문제

(지금 당신을 허락하기 위해, 나는 iPhone 3 개발 : SDK를 탐색하고 인터페이스 빌더를 사용하지 않는 책으로 iPhone을 위해 개발하는 법을 배우고 있습니다) Getter를 동일하게 사용할 이유가 있습니다. 수업, 개인 회원이 보이는 경우? foo.h처럼

NSObject *myObj;
...
@property (nonatomic, retain)NSObject *myObj;

그런 다음 foo.m에서 멤버에 액세스하십시오 myobj self.myobj (또는 [self myobj]) 사용? 내 책에서 여기에 앱 중 하나에 글을 쓰라고 지시하는 내용이 있습니다 (UiviewController 회원의 견해가 수퍼 뷰에 있는지 확인) :

if(self.yellowViewController.view.superview == nil) {

(주목하십시오 본인.YellowViewController ...) 실제로 그 이유가 있습니까? 내가 가지고있는 아이디어가 없다면 아마도 BlueViewController 회원이 클래스 BlueViewController이기 때문에 아마도 혼란을 일으키지 않는 이유가 없다고 생각합니다. 그렇다면 같은 수업에서 getter를 사용하는 곳이 언제입니까?

감사!!

도움이 되었습니까?

해결책

그렇습니다. 직접적으로 getter를 통해 Ivars에 액세스하는 것은 좋은 일입니다.

예를 들어, 코코아 (특히 자원이 매우 제한된 전화에서)의 정상적인 디자인 패턴 중 하나를 게으른 하중이라고합니다.

요약하면, 필요할 때까지 리소스를로드하지 않는다는 것을 의미합니다.

이상적으로, 요청 된 자원이로드되었는지 확인하고, 그렇지 않은 경우로드하는지 확인하는 Getter에 코드를 배치하려고합니다. IVAR에 직접 액세스하면 NIL이 반환됩니다. 대안은 부모 클래스가 시작될 때 모든 IVAR을 초기화하여 필요하거나 필요하지 않을 수도있는 데이터를 저장하기 위해 자원을 낭비 할 수 있습니다.

이것은 또한 잠재적으로 다시 검색 할 수있는 자원을 잠재적으로 배치 할 수 있습니다. applicationDidReceiveMemoryWarning: 자원이 꽉 조이는 경우 방법을 덤프하고 필요할 때 다시로드되기 때문입니다.

다른 팁

게으른 로딩 getter :

- (UIImageView*) getImageView
{
    if (!imageView)
    {
        imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"blah.png"]]; // just an example
    }
    return imageView;
}

ImageView가 정의되는 방법 (복사, 할당, 유지)에 따라 실제 할당을 수정해야하지만 이는 게으른로드의 의미입니다.

사용해야 할 몇 가지 이유 self.ivar 인스턴스 변수에 직접 액세스하는 대신 getter syntax :

  • 다른 사람들이 언급했듯이 게으른로드 속성
  • 서브 클래스는 속성을 무시하고 슈퍼 클래스를 존중할 수 있습니다.
  • 원자 속성을 사용하는 경우 속성에 액세스하는 유일한 올바른 방법은 Getter를 통한 것입니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top