2011-03-02 44 views
0

我有這樣一段代碼在Objective-C從tutorial採取:何時使用訪問器以及何時直接訪問屬性?

- (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; 

這裏調用setter時。

1

self.fetchedResultsController = theFetchedResultsController; 

相當於調用

[self setFetchedResultsController:theFetchedResultsController]; 

根據財產的性質,它有時是合法繞過類本身內部的setter方法 - 例如, dealloc - 但大部分要路由所有設置通過一個方法,以便它可以管理所有權和其他相關管理任務的時間。

如果你真的想直接在這裏訪問的伊娃,在最低限度,你需要確保該對象retain -ed恰當 - 在代碼中設置後顯示您release它。而且很有可能還有其他的事情發生在setFetchedResultsController以及。但沒有代碼我們只能猜測。 (舉例來說,我不禁想起了線路設置self爲代表應該是在二傳手,而不是在這裏。)

相反,線

return self.fetchedResultsController; 

等同於調用

return [self fetchedResultsController]; 

這應該是顯而易見的,爲什麼後者是內一個壞主意fetchedResultsController方法本身 - 你風與無限的重格雷斯。