In Nugget #143 Don't Forget SQLite, we mentioned various ways of persisting data and pointed out SQLite as a very powerful tool for data storage. But besides storing natively types such as NSDictionary and NSString as plist, you can also store custom classes of your own by using subclasses of NSCoder — NSKeyedUnarchiver and NSKeyedArchiver. You can archive objects into an NSData instance and unarchive from NSData instances. There's also convenience methods so you can do:
//Write to a file
[NSKeyedArchiver archiveRootObject:someObject toFile:aPath];
//Read from a file
NSObject* someObject = [NSKeyedUnarchiver unarchiveObjectWithFile:aPath];
You just need to make sure your own classes implement the methods -initWithCoder: and -encodeWithCoder: in the NSCoding protocol.
@implementation MyClass
//... other stuff
- (id)initWithCoder:(NSCoder*)decoder {
if (self = [super init]) {
self.property1 = [decoder decodeObjectForKey:@"property1"];
self.property2 = [decoder decodeObjectForKey:@"property2"];
}
return self;
}
- (id)encodeWithCoder:(NSCoder*)encoder {
[encoder encodeObject:self.property1 forKey:@"property1"];
[encoder encodeObject:self.property2 forKey:@"property2"];
}
@end
With that you can do something like this to write an object (graph) to disk:
MyClass* obj;
//Set up obj
NSDictionary* aDict = @{@"someKey":obj};
[NSKeyedArchiver archiveRootObject:aDict toFile:aPath];
This is very useful if you want to persist small bits of objects that includes instances of your own classes. Handy for caching. Alternatively you can use NSKeyedArchiver to create NSData instances and save them in plists too.
Sponsored: Learn how to make money selling your own apps. Start your app publishing business: go to LearnAppMaking.com and sign up!
.