TestSingleton.h:
@interface TestSingleton : NSObject @property (nonatomic, retain) NSString *testString; + (id)sharedInstance; - (BOOL)saveState; @end
TestSingleton.m:
#import "TestSingleton.h" static TestSingleton *sharedInstance = nil; @interface TestSingleton() @property (nonatomic, retain) NSString *file; @end @implementation TestSingleton @synthesize testString = _testString; @synthesize file = _file; - (void)dealloc { [_testString release]; [_file release]; [super dealloc]; } + (id)sharedInstance { @synchronized(self){ if(sharedInstance == nil){ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *testFile = [documentsDirectory stringByAppendingPathComponent:@"testfile.sav"]; Boolean fileExists = [[NSFileManager defaultManager] fileExistsAtPath:testFile]; if(fileExists) { sharedInstance = [NSKeyedUnarchiver unarchiveObjectWithFile:testFile]; } else{ sharedInstance = [[super allocWithZone:NULL] init]; } sharedInstance.file = testFile; } } return sharedInstance; } - (BOOL)saveState { return [NSKeyedArchiver archiveRootObject:self toFile:sharedInstance.file]; } - (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:_testString forKey:@"test"]; } - (id)initWithCoder:(NSCoder *)aDecoder{ self = [super init]; if(self){ _testString = [[NSString alloc] initWithString:[aDecoder decodeObjectForKey:@"test"]]; } return self; } @end
Now, in the app delegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { TestSingleton *singleton = [TestSingleton sharedInstance]; NSLog(@"PREVIOUS STATE: %@", singleton.testString); //Update testString singleton.testString = [[NSDate date] description]; NSLog(@"NEW STATE: %@", singleton.testString); return YES; } - (void)applicationWillResignActive:(UIApplication *)application { //This will save the state of the singleton object when the object tries to go the background [[TestSingleton sharedInstance] saveState]; }