0

我正在使用 CoreData,我试图将我的 ManagedObjectContext 对象从一个 ViewController 传递到第二个 View Controller。

这是我的第一个视图控制器的代码:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{   
    if ([[segue identifier] isEqualToString:@"showDetail"])
    {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];

        self.managedObjectContext = [self.fetchedResultsController managedObjectContext];

        [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
    }
}

prepareForSegue 调用我在第二个视图控制器上创建的名为 setManagedObjectContext 的方法:

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

当此代码遇到 Xcode 锁定并最终引发 BAD_Access 内存错误时。当我调试这段代码时,managedObjContext 有一个有效的内存位置,但是代码行一遍又一遍地点击,然后导致 XCode 崩溃。

self.managedObjectContext 只是我在 SecondViewController 类上的一个属性,它的声明如下:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

如果我使用它,注释掉的行就可以了:

NSManagedObjectContext *context = managedObjContext;

因此,似乎使用属性会导致问题,但我当然想使用它。关于它为什么不喜欢使用该属性的任何解释?

谢谢!跳蚤

4

1 回答 1

1

self.managedObjectContext =相当于调用setManagedObjectContext:. 所以你让自己陷入了一个递归循环。

覆盖 ivar 的设置器时,您需要直接访问 ivar,例如

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

通常,如果您要执行其他操作,则只需要覆盖 setter 的默认实现。

于 2013-02-12T16:41:32.923 回答