【问题标题】:One delegate class for multiple NSFetchedResultsController?多个 NSFetchedResultsController 的一个委托类?
【发布时间】:2012-04-22 14:39:32
【问题描述】:

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

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

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

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

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

编辑:我可以通过@property (nonatomic, retain) FetchedResultsDelegate *delegate; 解决问题,可以吗?有些人说的是分配而不是保留?

【问题讨论】:

  • 你用的是什么iOS?你使用 ARC 吗?
  • 两个代表都持有“assign”属性吗?
  • 我不明白你的意思?
  • 当您为代表定义@property 时,您是保留它还是分配它?

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


【解决方案1】:

没有什么可以保留您的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),这会导致保留周期

【讨论】:

  • 如果我这样做@property (nonatomic, retain) FetchedResultsDelegate *delegate;会怎样?
猜你喜欢
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多