我在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 :(得分:1)
该行
self.fetchedResultsController = theFetchedResultsController;
相当于调用
[self setFetchedResultsController:theFetchedResultsController];
根据属性的性质,有时绕过类本身内的setter方法是合法的 - 例如,在dealloc
中 - 但是大多数时候你想要通过那个方法路由所有设置方法,以便它可以管理所有权和任何其他相关的管理任务。
如果你真的想直接在这里访问ivar,那么在设置之后,你需要确保对象是retain
- 适当的 - 在你release
显示的代码中。并且很可能在setFetchedResultsController
中还发生了其他事情。但没有代码,我们只能猜测。 (例如,我不禁想到作为委托的行设置self
应该在setter而不是在这里。)
相反,该行
return self.fetchedResultsController;
相当于调用
return [self fetchedResultsController];
为什么后者 fetchedResultsController
方法本身是一个坏主意,你应该很清楚为什么会出现无限回归。
答案 1 :(得分:0)
accessor
是属性的setter
和getter
方法。
所以当你创建属性然后设置和获取属性值时,你需要访问器方法(意味着setter和getter)。
在代码中这一行
self.fetchedResultsController = theFetchedResultsController;
这里叫一个setter。