何时使用访问者以及何时直接访问属性?

时间:2011-03-02 08:03:39

标签: objective-c

我在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;

我不明白何时必须使用存取器以及何时必须使用存取器?

提前感谢您的帮助!

2 个答案:

答案 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是属性的settergetter方法。 所以当你创建属性然后设置和获取属性值时,你需要访问器方法(意味着setter和getter)。

在代码中这一行

self.fetchedResultsController = theFetchedResultsController;

这里叫一个setter。