2011-03-02 3 views
0

나는 이것을 tutorial에서 가져온 목표 - C 코드의 조각이 내 선언 파일에서접근자를 사용하는시기와 속성에 직접 액세스하는시기는?

- (NSFetchedResultsController *)fetchedResultsController { 
    if (fetchedResultsController_ != nil) { 
     return fetchedResultsController_; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"FailedBankInfo" 
               inManagedObjectContext:self.context]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"details.closeDate" ascending:NO]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

    [fetchRequest setFetchBatchSize:20]; 

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] 
                   initWithFetchRequest:fetchRequest 
                   managedObjectContext:self.context 
                   sectionNameKeyPath:nil 
                   cacheName:@"Root"]; 
    self.fetchedResultsController = theFetchedResultsController; 
    fetchedResultsController_.delegate = self; 

    [sort release]; 
    [fetchRequest release]; 
    [theFetchedResultsController release]; 

    return fetchedResultsController_; 
} 

을 나는이 있습니다

@interface FailedBankListViewController : UITableViewController 

<NSFetchedResultsControllerDelegate> { 
    NSFetchedResultsController *fetchedResultsController_; 
    NSManagedObjectContext *context_; 
} 

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController; 
@property (nonatomic, retain) NSManagedObjectContext *context; 

@end 

내 질문입니다 나는 코드를 작성해야 할 이유 그렇게 한 번 우리가 접근 사용하면 우리가 직접 속성에 액세스 :

if (fetchedResultsController_ != nil) { 
    return fetchedResultsController_; 
} 

// AND 

self.fetchedResultsController = theFetchedResultsController; 

을이 작동하지 않습니다 :

if (self.fetchedResultsController != nil) { 
    return self.fetchedResultsController; 
} 

// AND 

fetchedResultsController_ = theFetchedResultsController; 

언제 접근자를 사용해야합니까? 접근자를 사용해야하는시기는 언제입니까?

미리 도움 주셔서 감사합니다.

답변

0

accessor은 속성의 경우 settergetter입니다. 그래서 속성을 만들 때 속성 값을 설정하고 가져 오는 경우 접근 자 메서드 (setter 및 getter를 의미)가 필요합니다. 코드에서

이 줄을 여기

self.fetchedResultsController = theFetchedResultsController; 

세터가 호출됩니다. 에, 예를 들면 -

1

self.fetchedResultsController = theFetchedResultsController; 

은 호텔의 특성에 따라

[self setFetchedResultsController:theFetchedResultsController]; 

를 호출하는 것과 같습니다 라인, 클래스 자체 내부의 setter 메소드를 우회하기 위해 때때로 합법적 dealloc -하지만 대부분의 경우 소유권 및 기타 관련된 관리 작업을 관리 할 수 ​​있도록 해당 설정을 통해 모든 설정을 라우팅해야합니다.

실제로 여기 직접 ivar에 액세스하려는 경우, 객체가 retain -ed인지 확인해야합니다. 코드는 release으로 설정해야합니다. 그리고 setFetchedResultsController에도 다른 일이 일어날 가능성이 있습니다. 그러나 코드가 없으면 우리는 추측 할 수 있습니다. (예를 들어, 내가 위임 self 설정 라인이 여기보다는 세터에 있어야한다는 생각을 떨칠 수 없습니다.) 반대로

,

return self.fetchedResultsController; 

가 동등 라인을

을 호출하기
return [self fetchedResultsController]; 

후자는 안에 나쁜 생각 왜 그것은 분명해야 fetchedResultsController 방법 자체 - 당신이 무한 재와 바람 고레스.

관련 문제