// // PSDefaults.m // Perforce // // Created by Adam Czubernat on 13.12.2013. // Copyright (c) 2013 Perforce Software, Inc. All rights reserved. // #import "PSDefaults.h" @interface PSDefaults () { NSString *rootKey; NSMutableDictionary *root; NSString *relativeKeyPath; } - (NSArray *)properties; - (NSString *)keyPathForProperty:(NSString *)property; - (void)load; - (void)registerObserving; - (void)unregisterObserving; @end @implementation PSDefaults - (id)init { self = [super init]; if (self) { [self load]; [self registerObserving]; } return self; } - (void)dealloc { [self unregisterObserving]; } - (void)initDefaults; { [[NSUserDefaults standardUserDefaults] setObject:[NSDictionary dictionary] forKey:self.keyPath]; } - (NSString *)keyPath { return self.className; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; id value = [change objectForKey:NSKeyValueChangeNewKey]; [root setValue:value forKeyPath:[self keyPathForProperty:keyPath]]; [defaults setObject:root forKey:rootKey]; [defaults synchronize]; } - (NSArray *)properties { NSMutableArray *properties = [NSMutableArray array]; unsigned int count; objc_property_t *propertyList = class_copyPropertyList([self class], &count); for (unsigned int idx=0; idx