开发者

saving object state in dealloc doesn't work

开发者 https://www.devze.com 2023-02-24 22:55 出处:网络
I noticed just now that when I save object state (@public floats converted to NSStrings) in my dealloc method, using

I noticed just now that when I save object state (@public floats converted to NSStrings) in my dealloc method, using

+(void)savePreferences:(NSString*)key :(NSString*)value{
    NSMutableString* mutableString=[[NSMutableString alloc]initWithString:value];
    CFPreferencesSetAppValue((CFStringRef)key, mutableString, kCFPreferencesCurrentApplication);    // Set up the preference.
    CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);// Write out the preference data.
    [mutableString release];
}

the wrong values are saved!? If I instead save the values just before releasing, the correct values are saved. Note that I am careful to call [super dealloc];开发者_运维技巧 at the end. Why is this?


Several issues with that code;

  • saving state in -dealloc is way too late. By the time -dealloc is called, the object graph is in the midst of being torn down.

  • on app termination, the system will not waste cycles tearing down your application. It'll just inform it that it is about to be terminated and then terminate it; if you are relying on -dealloc to be called, that might likely never happen.

  • that method name isn't very good. Try something like savePreferencesValue:forKey:. However, the implication that it may be called many times would lead to a significant ineffeciency (in that it'd write the preferences plist over and over).

  • the mutable string copy of the incoming value is a waste of cycles and memory; no need for it

  • unless you need the extended features of CFPreferences*() you should just stick with NSUserDefaults; it will lead to less code and less fragility.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号