iphone – 多个NSFetchedResultsController的一个委托类?

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

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

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

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

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

编辑:我能够通过执行@property(非原子,保留)来解决问题FetchedResultsDelegate * delegate;这个可以吗?有些人在谈论分配而不是保留?

最佳答案 由于委托属性通常被声明为assign,因此没有任何东西保留您的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];
}

assign的使用完全取决于所有权语义.

在这种情况下,你的UITableViewController应该拥有tableView的委托(例如强/保留),因为没有别的.

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

点赞