ベストプラクティスは、アプリの最初のコントローラーからオブジェクトコンテキストを渡すことですが、アプリがナビゲーションコントローラーで始まり、コンテンツのみでコアデータを必要としないビューコントローラーがいくつかあることを考えると、これはより簡単なソリューション。
ヘッダ:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
@interface CoreDataViewController : UIViewController
- (void)saveContext;
//See ggfela's answer
//@property (readonly, strong, nonatomic) AppDelegate *appDelegate;
//@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, weak, nonatomic) AppDelegate *appDelegate;
@property (readonly, weak, nonatomic) NSManagedObjectContext *managedObjectContext;
@end
実装:
#import "CoreDataViewController.h"
@implementation CoreDataViewController
@synthesize appDelegate = _appDelegate;
@synthesize managedObjectContext = _managedObjectContext;
-(AppDelegate *)appDelegate
{
if(!_appDelegate) {
_appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
}
return _appDelegate;
}
-(NSManagedObjectContext *)managedObjectContext
{
if(!_managedObjectContext) {
_managedObjectContext = self.appDelegate.managedObjectContext;
}
return _managedObjectContext;
}
- (void)saveContext
{
[self.appDelegate saveContext];
}
@end
このクラスから継承してから管理対象オブジェクトコンテキストにアクセスしようとすると、SIGABRTエラーが発生します。これは、おそらくどこかにメモリリークがあることを意味します。私はObjective-Cにかなり慣れていないので、デバッグについてあまり知りません。
誰かが私が間違っていることを教えてもらえますか?
また、実際には別の方法(つまり、コントローラーから子コントローラーにコンテキストを渡す)を実行する必要があり、その結果、アップルがアプリをブロックする可能性がありますか?