我的应用程序中有几个NSFetchedResultsControllers
,在每个视图控制器中,我都实现了各自的委托方法。但是,我没有将这些委托方法复制到实现NSFetchedResultsController
的每个类中,而是认为我只想创建一个实现这些委托方法的类,并将所有获取结果控制器的委托设置为指向该类。这是我尝试过的,但不起作用:
由于委托方法需要知道它们正在对哪个表视图进行更改,我想我只想为每个获取的结果控制器创建一个单独的委托类,并发送指向该类的tableview的指针:
FetchedResultsDelegate *delegate = [[FetchedResultsDelegate alloc] initWithTableView:parentTableView];
self.fetchedResultsController.delegate=delegate;
[delegate release];
然而,这会导致BAD_ACCESS
崩溃,所以这意味着我可能不应该做我正在做的事情。
如何创建一个处理我NSFetchedResultsControllers
所有委托请求的委托类?
修改:我可以通过执行@property (nonatomic, retain) FetchedResultsDelegate *delegate;
来解决问题吗?这样可以吗?有些人在谈论分配而不是保留?
答案 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
),这会导致保留周期