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;
}