尝试从prepareForSegue设置ManagedObjectContext属性时出现BAD_ACCESS错误

时间:2013-02-12 16:37:33

标签: iphone ios xcode

我正在使用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;

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

谢谢! 跳蚤

1 个答案:

答案 0 :(得分:1)

self.managedObjectContext =相当于调用setManagedObjectContext:。所以你要进入一个递归循环。

当覆盖ivar的setter时,你需要直接访问ivar,例如

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

一般来说,如果你打算做其他的事情,你只需要覆盖一个setter的默认实现。