LoginSignup
0
0

はじめてのNursery その7 NUNurseryとNUGaradenのgradeの働き

Last updated at Posted at 2023-11-18

gradeとは

gradeとはNurseryにオブジェクトを保存する度に、新しくNurseryに割り当てられるユニークな値で、その値で対応するオブジェクトグラフ全体を識別します。

新しいGerdenを作成後にGardenにrootメッセージを送ると、GardenはNurseryの最新のgradeに対応するオブジェクトグラフを参照します。

例えば、次のコードでaGardenBにrootメッセージを送り、その時点のgradeを参照した後、
aGadenCでNurseryに保存したオブジェクトグラフに変更を加え保存しても、aGardenBにmoveUpメッセージを送って参照するNurseryのgradeを更新しない限り、aGardenBを通じて、安全に、aGardenBが参照しているgradeに対応するNurseryのオブジェクトグラフ全体を参照することが出来ます。

注意点としては、古いgradeを参照するGardenが存在する限り、その一番古いgrade未満のgradeのオブジェクトグラフまでしか、NurseryのデータベースファイルのGCの対象にならないため、もはや参照する必要がなくなったgradeを参照しているGardenにはmoveUpメッセージを送ってそれが参照するgradeを更新するか、Gardenのインスタンスそのものを解放する必要があります。

main.m

#import <Foundation/Foundation.h>
#import <Nursery/Nursery.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString *aFilepath = [NSHomeDirectory() stringByAppendingPathComponent:@"Example-of-NULibrary"];
        //ファイルパスを指定してデータベースオブジェクトを作成
        NUMainBranchNursery *aNursery = [NUMainBranchNursery nurseryWithContentsOfFile:aFilepath];
        
        //データベースに保存するオブジェクトを管理するオブジェクトを作成
        NUGarden *aGardenA = [aNursery makeGarden];
        
        //rootオブジェクトの作成と保存
        NULibrary *aLibrary = [NULibrary library];
        [aLibrary setObject:@"messageA" forKey:@"message"];
        [aGardenA setRoot:aLibrary];
        [aGardenA farmOut]; //メモリ上のオブジェクトをデータベースファイルに保存
        
        //別のGardenBを作成する
        NUGarden *aGardenB = [aNursery makeGarden];
        [aGardenB root]; //rootオブジェクトを参照することによって、aGardenAの保存直後のオブジェクトグラフを参照する
        
        //別のGardenCを作成する
        NUGarden *aGardenC = [aNursery makeGarden];
        aLibrary = [aGardenC root];
        //GardenCのルートオブジェクト(aGardenAの保存直後のルートオブジェクト)の内容をログ出力する
        NSLog(@"message:%@", [aLibrary objectForKey:@"message"]); //message:messageA
        //GardenCのルートオブジェクトの内容を変更し保存する
        [aLibrary setObject:@"messageC" forKey:@"message"];
        [aGardenC farmOut];
        //aGardenCの保存直後のルートオブジェクトの内容をログ出力する
        NSLog(@"message:%@", [aLibrary objectForKey:@"message"]); //message:messageC
        
        //GardenBのルートオブジェクトの内容をログ出力する
        aLibrary = [aGardenB root];
        NSLog(@"message:%@", [aLibrary objectForKey:@"message"]); //message:messageA
    }
    return 0;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0