I use NSUserDefaults all the time for storing simple users settings and application state. But there’s a whole lotta string literals and a bunch of repeating yourself that takes place. That sucks ….
So I like to create a category on NSUserDefaults so I can treat it like a concrete class, whose API is enforced by the compiler and autocompleted by Xcode. Here’s an example of how I use it to track a users email address within my app. Note the rcast_ prefix. Always a good idea to prefix your categories to prevent future name collisions.
//NSUserDefaults_RCastr.h
@interface NSUserDefaults (RCastr)
@property (assign, getter=rcast_userEmail,
setter=rcast_setUserEmail:) NSString *rcast_userEmail;
//NSUserDefaults_RCastr.m
#import "NSUserDefaults+RCastr.h"
NSString *const rcastDefaultsKeyUserEmail = @"rcast_userEmail";
@implementation NSUserDefaults (RCastr)
#pragma mark -
#pragma mark Username
- (NSString *)rcast_userEmail {
return [self stringForKey:rcastDefaultsKeyUserEmail];
}
- (void)rcast_setUserEmail:(NSString *)userEmail {
[self setObject:userEmail forKey:rcastDefaultsKeyUserEmail];
[self synchronize];
}
@end
That allows me to use user defaults like the following:
//Set the email address
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
defaults.rcast_userEmail = @"user@domain.com";
//Get the email address
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (defaults.rcast_userEmail){
[FlurryAnalytics setUserID:defaults.rcast_userEmail];
}
Dead easy change, but much cleaner and far less error prone.