0

CoreDataを使用していて、ManagedObjectContextオブジェクトを1つのViewControllerから2番目のViewControllerに渡そうとしています。

FirstViewControllerのコードは次のとおりです。

- (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は、2番目のViewControllerで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;
}

通常、セッターのデフォルトの実装をオーバーライドする必要があるのは、それ以外の方法で追加の作業を行う場合のみです。

于 2013-02-12T16:41:32.923 に答える