我的应用程序中有多个 NSFetchedResultsControllers
,在每个 View Controller 中,我都实现了相应的委托(delegate)方法。但是,我认为我不会将这些委托(delegate)方法复制到每个实现 NSFetchedResultsController
的类中,而是创建一个实现这些委托(delegate)方法的类,并将所有获取的结果 Controller 的委托(delegate)设置为指向该类.这是我尝试过的方法,但没有用:
由于委托(delegate)方法需要知道它们正在对哪个 TableView 进行更改,所以我想我应该为每个获取的结果 Controller 创建一个单独的委托(delegate)类,并为该类发送一个指向 TableView 的指针:
FetchedResultsDelegate *delegate = [[FetchedResultsDelegate alloc] initWithTableView:parentTableView];
self.fetchedResultsController.delegate=delegate;
[delegate release];
但是,这会导致 BAD_ACCESS
崩溃,所以这意味着我可能不应该做我上面正在做的事情。
如何创建一个委托(delegate)类来处理所有 NSFetchedResultsControllers
的所有委托(delegate)请求?
编辑:我能够通过执行 @property (nonatomic, retain) FetchedResultsDelegate *delegate;
解决问题,这样可以吗?有些人在说分配而不是保留?
最佳答案
没有任何内容保留您的 FetchedResultsDelegate
,因为委托(delegate)属性通常声明为分配。例如NSFetchedResultsController将委托(delegate)声明为
@property(nonatomic, assign) id <NSFetchedResultsControllerDelegate> delegate
因此,您创建了该对象并立即将其销毁,但为 fetchedResultsController 提供了一个讨厌的悬挂指针。
要解决此问题,您需要对委托(delegate)进行保留。所以在你的 UITableViewController 类中添加一个新属性
// .h
@property (nonatomic, strong) id<NSFetchedResultsControllerDelegate> tableViewDelegate;
// .m
@synthesize tableViewDelegate = _tableViewDelegate;
然后当你连接时你委托(delegate)只是改变你的代码
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 的委托(delegate)(例如 strong
/retain
),别无其他。
NSFetchedResultsController
使用assign
而不是retain
/strong
的原因是因为很有可能创建它的对象将充当委托(delegate),这将导致两个对象相互拥有(都有一个 retain
相互持有),这会导致一个保留周期
关于iphone - 多个 NSFetchedResultsController 的委托(delegate)类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10268878/