문제

많은 Apple 코드 예제 중 하나에서 약간의 코드를 구현했지만 속성 중 하나의 고정 속성이 작동하지 않기 때문에 약간의 문제가 있습니다. 부동산 선언은 다음과 같습니다.

@property (nonatomic, retain) EditingViewController *editingViewController;

코드는 다음과 같습니다.

- (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (editingViewController == nil) {
        EditingViewController *aController = [[EditingViewController alloc] init];
        editingViewController = aController;
        [aController release];
    }
    return editingViewController;
}

나는 (보유)가 양도시 유지 카운트가 1 증가하게된다는 것을 이해한다. 그러나 i가 아니라면 코드가 실패합니다 하다 Acontroller retain] 직접 보내십시오 ~하지 않다 Acontroller 릴리스]를 보내십시오. 내가 여기서 무엇을 놓치고 있습니까?

도움이 되었습니까?

해결책

참조 할 때 editingViewController, 그것은 동일합니다 self->editingViewController, 즉 IVAR에 대한 접근.

getter 또는 setter를 사용하려면 사용해야합니다. self.editingViewController, 또는 동등하게 [self setEditingViewController:aController].

그렇기 때문에 제가 호텔과 다른 이름을 가진 IVAR을 사용하는 것을 선호하는 이유입니다.

EditingViewController* i_editingViewController;

@property (nonatomic, retain) EditingViewController *editingViewController;

@synthesize editingViewController = i_editingViewController;

그런 다음 게으른 getter를 다음과 같이 쓸 수 있습니다.

- (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (i_editingViewController == nil) {
        i_editingViewController = [[EditingViewController alloc] init];
    }
    return i_editingViewController;
}

또는

- (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (i_editingViewController == nil) {
        EditingViewController *aController = [[EditingViewController alloc] init];
        self.editingViewController = aController;
        [aController release];
    }
    return i_editingViewController;
}

아마도 이전 방법 (세터를 호출하지 않음)을 사용할 것입니다. editingViewController (어떤 관찰자가 보았 듯이) 실제로는 바뀌지 않았지만 어느 쪽이든 잘 작동해야하며 다른 이름 (IVAR 및 재산의 경우)은 혼란이나 우발적 인 오용을 피하는 데 도움이됩니다. 또한 속성을 사용하는 것이 약간의 격려입니다 (약간 추악한 접두사를 피하기 때문).

Apple은 _ 접두사를 보유하며 세터와 게터는 init/dealloc 루틴.

다른 팁

당신은 써야합니다 self.editingViewController 속성을 사용하기 위해. 단지 "editingViewController"클래스 멤버 변수에 직접 액세스하는 반면 self.editingViewController Self SetEditingViewController : ...]와 동일하며 적절한 유지/릴리스 작업을 수행합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top