0

ベストプラクティスは、アプリの最初のコントローラーからオブジェクトコンテキストを渡すことですが、アプリがナビゲーションコントローラーで始まり、コンテンツのみでコアデータを必要としないビューコントローラーがいくつかあることを考えると、これはより簡単なソリューション。

ヘッダ:

#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にかなり慣れていないので、デバッグについてあまり知りません。

誰かが私が間違っていることを教えてもらえますか?

また、実際には別の方法(つまり、コントローラーから子コントローラーにコンテキストを渡す)を実行する必要があり、その結果、アップルがアプリをブロックする可能性がありますか?

4

1 に答える 1

1

strong はセッターに適用され、読み取り専用のプロパティがあるため、strong 属性を使用しないでください。

于 2012-04-24T11:02:45.833 に答える