多个NSFetchedResultsController的一个委托类?

时间:2012-04-22 14:39:33

标签: iphone objective-c ios core-data nsfetchedresultscontroller

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

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

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

然而,这会导致BAD_ACCESS崩溃,所以这意味着我可能不应该做我正在做的事情。

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

修改:我可以通过执行@property (nonatomic, retain) FetchedResultsDelegate *delegate;来解决问题吗?这样可以吗?有些人在谈论分配而不是保留?

1 个答案:

答案 0 :(得分:2)

由于委托属性通常被声明为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的委托(例如strong / retain),而不是其他任何内容。

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