2012-07-11 112 views
0

Xcode的模板代碼:MasterDetailApplication(使用核心數據) 在MasterViewController.m的爲什麼這段代碼不會造成無限循環?

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

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
// Edit the entity name as appropriate. 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

// Set the batch size to a suitable number. 
[fetchRequest setFetchBatchSize:20]; 

// Edit the sort key as appropriate. 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO]; 
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; 

[fetchRequest setSortDescriptors:sortDescriptors]; 

// Edit the section name key path and cache name if appropriate. 
// nil for section name key path means "no sections". 
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"]; 
aFetchedResultsController.delegate = self; 
self.fetchedResultsController = aFetchedResultsController; 
NSError *error = nil; 
if (![self.fetchedResultsController performFetch:&error]) { 
    // Replace this implementation with code to handle the error appropriately. 
    // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

return __fetchedResultsController; 
}  

問題是實現:此代碼使用一個getter中的財產,爲什麼不會這導致無限循環? 我的意思是這條線:

self.fetchedResultsController = aFetchedResultsController; 

回答

2

因爲你使用的是setter,而不是getter。

self.property = something; 

這將調用setter方法:

[self setProperty:something]; 

,而不是吸氣:

[self property]; 
3

代碼使用getter中的財產,但與self.prop = value語法,它會調用setter,(而不是getter中的getter)。所以這個代碼沒有理由產生一個無限循環。

無論如何,這是一個相當奇怪的getter實現。

通常情況下,如果setter不會自行調用getter,那麼在getter方法內部調用setter方法不會有任何問題。當然,如果setter自己調用getter,那麼你將會有你的無限循環,getter調用setter調用getter等等。

+0

+1但是你不能保證從getter調用等價的setter沒有問題;這樣做肯定是缺乏清晰的思想...... – trojanfoe 2012-07-11 09:26:17