iphone - 多个 NSFetchedResultsController 的委托(delegate)类?

标签 iphone objective-c ios core-data nsfetchedresultscontroller

我的应用程序中有多个 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/

相关文章:

iphone - iPhone:YAJL被AppStore接受使用吗?

iphone - 在 iOS 5 中为 UINavigationBar 设置不同的背景图像

iphone - IBOutlets 使用的内存是如何管理的?

iphone - 如何在 C# 中读取返回 json 的裸 Web 服务

iphone - 我怎样才能在 cocos2d 中垂直而不是水平移动这些背景图像?

iphone - 使用自动布局时动画 View 宽度

ios - applicationWillEnterForeground 要求重启 iphone?

javascript - jQuery 可以在 Safari 上工作,但不能在 iOS 上工作 - 我可以做什么来调试?

iphone - 我们如何为 GLFloat 赋值以在 iPhone 应用程序中画一条线?

iphone - objective-c 中的后台任务