4

我的应用程序中有几个NSFetchedResultsControllers,并且在每个视图控制器中,我实现了各自的委托方法。但是,与其将这些委托方法复制到每个实现 的类中NSFetchedResultsController,我想我只是创建一个实现这些委托方法的类,并将所有获取的结果控制器的委托设置为指向该类。这是我尝试过的,但不起作用:

由于委托方法需要知道他们正在对哪个表视图进行更改,我想我只需为每个获取的结果控制器创建一个单独的委托类,并为该类发送一个指向表视图的指针:

FetchedResultsDelegate *delegate = [[FetchedResultsDelegate alloc] initWithTableView:parentTableView];
self.fetchedResultsController.delegate=delegate;
[delegate release];

但是,这会导致BAD_ACCESS崩溃,所以这意味着我可能不应该做我上面所做的事情。

如何创建一个单一的委托类来处理我所有的委托请求NSFetchedResultsControllers

编辑:我可以通过这样做来解决问题@property (nonatomic, retain) FetchedResultsDelegate *delegate;吗?有些人在说分配而不是保留?

4

1 回答 1

2

没有什么可以保留您的FetchedResultsDelegate作为委托属性通常声明为分配。例如NSFetchedResultsController将委托声明为

@property(nonatomic, assign) id <NSFetchedResultsControllerDelegate> delegate

因此,您创建了对象并立即将其销毁,但给 fetchedResultsController 一个讨厌的悬空指针。

要解决此问题,您需要保留代表。所以在你的 UITableViewController 类中添加一个新属性

// .h
@property (nonatomic, strong) id<NSFetchedResultsControllerDelegate> tableViewDelegate;

// .m
@synthesize tableViewDelegate = _tableViewDelegate;

然后,当您连接时,您只需将代码更改为此

FetchedResultsDelegate *delegate = [[FetchedResultsDelegate alloc] initWithTableView:parentTableView];
self.fetchedResultsController.delegate = delegate;
self.tableViewDelegate = delegate;
[delegate release]; delegate = nil;

不要忘记

在 dealloc 中释放这个新的 ivar

- (void)dealloc;
{
    // ... other releases
    [_tableViewDelegate release];
    [super dealloc];
}

分配的使用完全与所有权语义有关。

在这种情况下,您UITableViewController应该拥有 tableView 的委托(例如strong/ retain),因为没有别的。

NSFetchedResultsController使用assign而不是retain/的原因strong是因为创建它的对象很有可能充当委托,这将导致两个对象相互拥有(两者都retain相互持有),从而导致保留循环

于 2012-04-22T14:50:31.690 回答