2012-02-20 9 views
0

これまでは共有のCoredataインスタンスを使用していました。ビューコントローラでは、私は[[Storage instance] managedObjectContext]を呼び出して、ビューコントローラに渡します。Coredata managedobjectContextと私的なivarsの共有インスタンス

私は残酷に間違っているかもしれませんか?どうしてか言ってくれない。

ほとんどの例で気付いたように、viewControllerのヘッダファイルには@privateのmanagedObjectContextがあります。なぜプライベートコールが必要なのですか?

最後に、我々はviewController.m

@synthesize managedObjectContext = _managedObjectContext; 

いただきました! "_" managedObjectContextの重要性が、その後

NSManagedObjectContext *_managedObjectContext; 
    @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; 

のように宣言します。どうしてアンダースコア?

最後に、このすべてがiCloudにどのような影響を与えますか?作家が言った1つのチュートリアルでは、

アイバーズはprivateである必要があり、すべてのコード は、常にこれらが 正しく初期化されていることを確認するために、アクセサメソッドを経由することに非常に重要です。面白いことがなければ_ KVCは をあまりにも助けてくれるかもしれません。 iCloudには、非同期でデータをインポートすると、より多くの タイミングとマルチスレッドの問題

はあなたが表示されない... WATSがここで起こっ

@interface LStorage : NSObject { 

@private 
    NSString *identifier; 
    NSManagedObjectContext *managedObjectContext; 
    NSManagedObjectModel *managedObjectModel; 
    NSPersistentStoreCoordinator *persistentStoreCoordinator; 
} 

@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; 

+ (LStorage *) instance; 

in LStorage.m 

+ (LStorage *) instance { 
    @synchronized(self) { 
     if (instance == nil) { 
      instance = [[LStorage alloc] initWithIdentifier:kIdentifier]; 
     } 
    } 
    return instance; 
} 
//identifier is just used to name the mom model filename. 
- (id) initWithIdentifier:(NSString *)anIdentifier { 
    self = [super init]; 

    if(self != nil) { 
     identifier = anIdentifier; 
    } 

    return self; 
} 
- (NSManagedObjectContext *)managedObjectContext { 

    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 

    if (coordinator != nil) { 
     // Make life easier by adopting the new NSManagedObjectContext concurrency API 
     // the NSMainQueueConcurrencyType is good for interacting with views and controllers since 
     // they are all bound to the main thread anyway 

     if(IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0")){ 
     NSManagedObjectContext* moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 

     [moc performBlockAndWait:^{ 
      // even the post initialization needs to be done within the Block 
      [moc setPersistentStoreCoordinator: coordinator]; 
      [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(mergeChangesFrom_iCloud:) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:coordinator]; 
     }]; 
     managedObjectContext = moc; 
     }else{ 
      managedObjectContext = [[NSManagedObjectContext alloc] init]; 
      [managedObjectContext setPersistentStoreCoordinator:coordinator]; 
     } 
    } 

    return managedObjectContext; 
} 

答えて

0

を説明してください...面白い_なしですどのようにあなたのNSManagedObjectContextが初期化されているのですか?Appleが提供するボイラープレートコードを使用していると仮定しています。 managedObjectContextを遅延この方法でロードされていることを

- (NSManagedObjectContext*)managedObjectContext 
{ 
    if (_managedObjectContext != nil) 
     return _managedObjectContext; 
    // Code to initialise and return context here 
} 

注:その場合は、次のような査定を持つ必要があります。つまり、メソッドが最初にself.managedObjectContextまたは[self managedObjectContext]でアクセスされたときにのみコンテキストが作成されます(またはプロパティに他のクラスからアクセス可能な場合は外部的に)。

ここで、このメソッドにアクセスしたことがないので、_managedObjectContext ivarがnilまたはメモリガーベジを指しているとします。 ivarに直接アクセスしようとすると、メモリブロックにNSManagedObjectContextが格納されていないため、クラッシュします。

これは、ivar名の先頭または末尾にアンダースコア(_)を追加するのが一般的な理由です。合成されたゲッターではなく、直接ivarに直接アクセスするのを避けるためです。

IVARは単にあなたがちょうどあなたが直接IVARにアクセスしているmanagedObjectContextと突然のすべてを記述するかもしれない、すなわち代わりにself.managedObjectContextを書くのその間違いを作ることが容易であるmanagedObjectContext命名された場合。

そこで、基本的synthesize managedObjectContext = _managedObjectContext;が何を意味するのかmanagedObjectContextと呼ばれるゲッター(そしておそらくセッター)メソッドを合成し、_managedObjectContext呼ばIVARに代入* です。*

+0

私はウルコメント – jasonIM

+0

で更新あなたイニシャライザは問題ありません。そのクラスの中の 'managedObjectContext'メソッドにもっと興味があります。 – jasonIM

+0

をしたいと思います初期化子 – Rog

関連する問題