我正在使用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;
所以似乎使用属性导致问题,但我当然想使用它。有关为什么不喜欢使用该属性的任何解释?
谢谢! 跳蚤
答案 0 :(得分:1)
self.managedObjectContext =
相当于调用setManagedObjectContext:
。所以你要进入一个递归循环。
当覆盖ivar的setter时,你需要直接访问ivar,例如
- (void)setManagedObjectContext:(NSManagedObjectContext *)managedObjContext;
{
_managedObjectContext = managedObjectContext;
}
一般来说,如果你打算做其他的事情,你只需要覆盖一个setter的默认实现。