Nurseryとは、Cocoaフレームワーク向けのオブジェクト指向データベース(OODB)です。 フレームワークとして開発しているので、アプリケーションに組み込む形で利用できます。
ライセンスは、zlibですので、商用・非商用のどちらでも利用できます。
- シンプルかつパワフル
 - ほぼ全てをObjective-Cで記述
 - FoundationフレームワークとCore Foundationフレームワーク(ソケット作成のため)のみで実装
 - ACID準拠
 - 遅延読み込み
 - データベースファイル内のガベージコレクションとコンパクション
 - 複数プロセスからの同時使用
 - ORMではない
 
- NULibrary B+木を実装したコレクションクラス
 - NUCoding プロトコルを実装したクラス
 - NUCoder のサブクラスを使って永続化処理を実装したクラス
 - NSObject
 - NSString
 - NSMutableString
 - NSArray
 - NSMutableArray
 - NSDictionary
 - NSMutableDictionary
 - NSSet
 - NSMutableSet
 - NSNumber
 - NSDate
 - NSURL
 - NSData
 - NSMutableData
 - NSIndexSet
 - NSMutableIndexSet
 
#import <Nursery/Nursery.h>
NUMainBranchNursery *aNursery = [NUMainBranchNursery nurseryWithContentsOfFile:@"path/to/file"];
NUGarden *aGarden = [aNursery makeGarden];
[aGarden setRoot:@"Hi, I'm Nursery"];
    
[aGarden farmOut];#import <Nursery/Nursery.h>
NUMainBranchNursery *aNursery = [NUMainBranchNursery nurseryWithContentsOfFile:@"path/to/file"];
NUGarden *aGarden = [aNursery makeGarden];
    
Person *aPerson = [Person new];
[aPerson setFirstName:@"Nursery"];
[aPerson setLastName:@"Lessercomputer"];
[aGarden setRoot:aPerson];
    
[aGarden farmOut];
// Person Class
@interface Person : NSObject <NUCoding>
{
    NSString *firstName;
    NSString *lastName;
}
@property (weak) NUBell *bell;
- (NSString *)firstName;
- (void)setFirstName:(NSString *)aFirstName;
- (NSString *)lastName;
- (void)setLastName:(NSString *)aLastName;
@end
@implementation Person
+ (BOOL)automaticallyEstablishCharacter
{
    return YES;
}
+ (void)defineCharacter:(NUCharacter *)aCharacter on:(NUGarden *)aGarden
{
    [aCharacter addOOPIvarWithName:@"firstName"];
    [aCharacter addOOPIvarWithName:@"lastName"];
}
- (void)encodeWithAliaser:(NUAliaser *)anAliaser
{
    [anAliaser encodeObject:firstName forKey:@"firstName"];
    [anAliaser encodeObject:lastName forKey:@"lastName"];
}
- (instancetype)initWithAliaser:(NUAliaser *)anAliaser
{
    self = [super init];
    if (self)
    {
        firstName = [anAliaser decodeObjectForKey:@"firstName"];
        lastName = [anAliaser decodeObjectForKey:@"lastName"];
    }
    return self;
}
- (NSString *)firstName
{
    return NUGetIvar(&firstName);
}
- (void)setFirstName:(NSString *)aFirstName
{
    NUSetIvar(&firstName, aFirstName);
    [[self bell] markChanged];
}
- (NSString *)lastName
{
    return NUGetIvar(&lastName);
}
- (void)setLastName:(NSString *)aLastName
{
    NUSetIvar(&lastName, aLastName);
    [[self bell] markChanged];
}
@endmacOS (10.13 以上)
- プロジェクトページの"Open with Xcode"ボタンをクリックして、デスクトップ等にクローンする
 - Xcodeのメニューバーの"Product"から"Build"を選択する
 
インスタンス変数はエンコーディング時にビッグエンディアンに変換され、デコード時にホストのエンディアンに変換されます
オブジェクトの読み込みと保存は、そのオブジェクトのエンコード/デコード時に呼び出されるメソッドがスレッドセーフである限り、スレッドセーフです。
Nursery は複数プロセスからの同時使用をサポートしています
Nursery は write-ahead ロギング (WAL)を実装しています
- Nursery のルートオブジェクトから到着できないオブジェクトは、GCによって自動的に解放されます
 - 循環参照を適切に取り扱えます
 - GCのアルゴリズムには3色マーキングを採用しています
 - 解放された領域はコンパクト化されます
 
バグ修正歓迎です