在 dealloc 中保存对象状态不起作用

Posted

技术标签:

【中文标题】在 dealloc 中保存对象状态不起作用【英文标题】:saving object state in dealloc doesn't work 【发布时间】:2011-04-14 05:11:04 【问题描述】:

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

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

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

【问题讨论】:

您确定-dealloc 被调用,因此+savePreferences:: 也被调用? 您不只是使用NSUserDefaults 的任何特殊原因? (因为您发布的代码似乎没有做任何 NSUserDefaults 无法做到的事情(前提是您不假设总是会调用 -dealloc)。 【参考方案1】:

该代码存在几个问题;

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

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

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

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

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

【讨论】:

@bbum,@NSGod。感谢cmets,建议。我尝试用[[NSUserDefaults standardUserDefaults] setObject:key forKey:value]; 替换savePreferences 和用[[NSUserDefaults standardUserDefaults] stringForKey:key]; 替换loadPreferences 但这不起作用!?--即使我同步时,首选项也没有保存。 [[NSUserDefaults standardUserDefaults] stringForKey:key]; 与我原来的 savePreferences 配对时有效。 @bbum。 “传入值的可变字符串副本是对周期和内存的浪费;不需要它。”真的。不知道为什么我有那个。谢谢。 鉴于 NSUserDefaults CFPreferences 不起作用,我猜你的问题出在其他地方;特别是首先如何得出数据。您是否首先确保将正确的值传递到默认持久性代码中? @bbum,CFPreferences 的问题是我在 dealloc 中保存状态。只要我不这样做,我的代码就可以正常工作。但是我无法让 NSUserDefaults 工作(除了我的 loadPreferences,当与我原来的基于 CFPreferences 的 savePrefrences 函数配对时!?)。我接受你的回答,只需要澄清一下! 这取决于哪个-dealloc。如果它是在您的应用程序的一部分被拆除(终止等)时发生的释放,那么框架的内部状态可能是未定义的。这就是为什么除了基本的资源获取之外在 dealloc 中做 anything 是一个非常糟糕的主意。根据定义,对象图处于不确定状态;你不知道还有什么可能已经被部分或完全拆除或释放。

以上是关于在 dealloc 中保存对象状态不起作用的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.0 部分状态保存似乎不起作用

保存的首选项在重新启动时不起作用

在 Angular 6 中选择带有 RxJS 的状态不起作用

反应状态下的对象数组不起作用

为啥我的控制器中的保存功能不起作用?

没有情节提要的 UIViewController 状态恢复不起作用