속성 속성“retain”이 작동하지 않는 것 같습니다.
-
06-07-2019 - |
문제
많은 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 : ...]와 동일하며 적절한 유지/릴리스 작업을 수행합니다.