0

首先,这是我的基本设置。我正在尝试将 NSManagedObjectContext (MOC) 从我的 AppDelegate 传递给选定的自定义 ViewController。

首先,在“AppDelegate.m”中,我这样做:

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
FirstTableViewController *tableVC = (FirstTableViewController *)navigationController.topViewController;
tableVC.managedObjectContext = self.managedObjectContext;

将 MOC 传递给位于 navigationController 和自定义 ViewController 之间的 tableViewController。

到目前为止,这不会导致任何错误。

但是,在 tableViewController“FirstTableViewController.m”中,我想使用 prepareforsegue 将 MOC 传递到自定义 ViewController:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"mapClicked"]) {
        CustomScrollViewController *customSVC = [segue destinationViewController];
        NSManagedObjectContext *context = self.managedObjectContext;

        [customSVC setManagedObjectContext:context];
    }
}

然后在自定义 ViewController "CustomScrollViewController.m" 中调用以下方法:

- (void)setManagedObjectContext:(NSManagedObjectContext *)context
{
    self.managedObjectContext = context;
}

这就是它卡住的地方。它似乎一遍又一遍地执行该方法,(请参阅此处)然后崩溃。

如果您需要查看更多代码,这里是 github 存储库

任何帮助表示赞赏!

4

2 回答 2

2

您可能根本不需要自定义 setter 方法setManagedObjectContext,因为如果需要,编译器会自动创建属性访问器方法。

但是如果你使用自定义的 setter,它必须直接在 setter 中访问实例变量:

- (void)setManagedObjectContext:(NSManagedObjectContext *)context
{
    _managedObjectContext = context;
}

原因是

self.managedObjectContext = context;

由编译器翻译成

[self setManagedObjectContext:context];

在那里你有递归。

于 2013-11-07T08:54:41.747 回答
1

此代码包含您的问题:

- (void)setManagedObjectContext:(NSManagedObjectContext *)context
{
    self.managedObjectContext = context;
}

您应该简单地综合您的属性。这段代码实际上会导致:

- (void)setManagedObjectContext:(NSManagedObjectContext *)context
{
    [self setManagedObjectContext:context];
}

所以你看到递归了吗?所以要么综合,或者,如果你真的想自己实现这个:(我假设你使用 ARC,并且有一个名为 _context 的实例变量。

- (void)setManagedObjectContext:(NSManagedObjectContext *)context
{
    _context = context;
}

此外,如果您正在实现自己的 getter,那么应该是这样的:

- (NSManagedObjectContext *) managedObjectContext{
    return _context;
}
于 2013-11-07T08:56:17.113 回答