2010-12-01 9 views
3

ViewControllers間のNSManagedObjectsを悪い考えですか?私はiPadのアプリを持っていると私はランダムな不正アクセスのクラッシュとsigbartのエラーに実行されるようだ。ViewControllers間でNSManagedObjectsを渡す - ランダムな不正アクセスエラー

これらのNSManageObjectsはCoreDataから来ていて、時にはメモリがなくなってこれを引き起こすのだろうかと思います。私はすべてのviewcontrollerでフェッチをするのを避けるためにコントローラからコントローラに渡すことを望んでいました。

答えて

6

悪いオブジェクトのメモリ割り当ての問題のようですね。アプリケーションをマルチスレッド化しておらず、managedObjectContext(典型的)が1つしかない限り、これらのNSManagedObjectsをVeiwControllers間で問題なく渡すことができます。

おそらく起こっていることは、保持メッセージでrefcountをインクリメントせずに一方のViewControllerから別のViewControllerへの参照を渡していることでしょう。これは恐ろしいことができます。

私がお勧めすると、あなたが管理対象オブジェクトを取得するときに、このようにそれを維持し、その後

@property (nonatomic, retain) NSManagedObject *yourObject; 

のように、あなたのViewControllers上の特性を保持持っている:

self.yourObject = ...; 

...

otherViewController.yourObject = ...; 

これを別のビューコントローラに渡す場合は、あなたのためのin/release。

+0

私はMBProgressHUDを自分のアプリケーションに追加したので、マルチスレッド化を追加しました。 – Slee

2

あなたは適切なメモリ管理のセマンティクスに従わないのと同じような音です。 Memory Management Programming Guideを読むことをお勧めします。あなたが正しいメモリ管理ルールに従っているなら、安全でないという理由は全くありません。 NSManagedObjectsをスレッド間で渡すことはできませんが、常にメインスレッドとなるビューコントローラのコンテキストと同じスレッド上にいる限り、問題はありません。

1

新しいView Controllerに渡すときに、NSManagedObjectコンテキストを保持しないようにしてください。これに対処するための最良の方法は、単にあなたがもう一度、プロパティにこれを割り当てた場合retainを使用せずに、

[[[UIApplication sharedApplication] delegate] managedObjectContext]; 

を使用して、managedObjectContextのAppDelegateのインスタンスにアクセスすることです、あなたはメモリ管理で問題ないはずです。

関連する問題