0

我刚才注意到,当我在我的 dealloc 方法中保存对象状态( @public floats 转换为s )时,使用NSString

+(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];
}

保存了错误的值!?如果我在发布之前保存值,则会保存正确的值。请注意,我[super dealloc];最后调用时很小心。为什么是这样?

4

1 回答 1

2

该代码有几个问题;

  • 在 -dealloc 中保存状态为时已晚。到 -dealloc 被调用时,对象图正在被拆除。

  • 在应用程序终止时,系统不会浪费周期来拆除您的应用程序。它只会通知它即将终止,然后终止它;如果您依赖 -dealloc 被调用,那可能永远不会发生。

  • 该方法名称不是很好。尝试类似的东西savePreferencesValue:forKey:。但是,它可能被多次调用的暗示会导致显着的低效率(因为它会一遍又一遍地编写首选项 plist)。

  • 传入值的可变字符串副本是循环和内存的浪费;没必要

  • 除非您需要 CFPreferences*() 的扩展功能,否则您应该坚持使用 NSUserDefaults;它将导致更少的代码和更少的脆弱性。

于 2011-04-14T06:19:39.870 回答