If you do synchronize when shutting down the app for example:
- (void)applicationWillResignActive:(UIApplication *)application
{
[[NSUserDefaults standardUserDefaults] synchronize];
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
It will try to write to dummy file first and do a atomic rename after. If the writing takes to long you will end up with a dummy file.
In my case I had some users with 14mb plists and end up having a lot of dummy files (taking almost 2G).
My problem and fix was to compress a image which I wrote to the userdefaults.