Iphone 在dealoc中保存对象状态不会';行不通
我刚才注意到,当我在dealloc方法中保存对象状态(Iphone 在dealoc中保存对象状态不会';行不通,iphone,objective-c,release,dealloc,Iphone,Objective C,Release,Dealloc,我刚才注意到,当我在dealloc方法中保存对象状态(@public floats转换为NSStrings)时,使用 +(void)savePreferences:(NSString*)key :(NSString*)value{ NSMutableString* mutableString=[[NSMutableString alloc]initWithString:value]; CFPreferencesSetAppValue((CFStringRef)key, mutab
@public float
s转换为NSString
s)时,使用
+(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 dealoc]代码>在末尾。这是为什么?该代码有几个问题
- 在-dealoc中保存状态为时已晚。在调用-dealoc时,对象图正处于被拆除的过程中
- 在应用程序终止时,系统不会浪费周期来拆卸应用程序。它只会通知它即将终止,然后终止它;如果您依赖于调用-dealoc,那么这种情况可能永远不会发生
- 这个方法名不是很好。尝试类似于
savepreferencevalue:forKey:
的方法。然而,它可能会被多次调用,这意味着它会导致严重的效率低下(因为它会一遍又一遍地写首选项plist)
- 传入值的可变字符串副本浪费了周期和内存;没必要
- 除非您需要CFPreferences*()的扩展功能,否则您应该坚持使用NSUserDefaults;它将减少代码和脆弱性
您确定调用了-dealloc
,因此也调用了+savePreferences::
吗?您不只是使用NSUserDefaults
有什么特殊原因吗?(因为您发布的代码似乎没有做任何NSUserDefaults
无法做的事情(前提是您没有假设总是调用-dealloc
。@bbum,@nsgood。感谢您的评论和建议。我尝试将savePreferences
替换为[[NSUserDefaults standardUserDefaults]setObject:key-forKey:value];
和加载首选项
与[[NSUserDefaults standardUserDefaults]stringForKey:key];
但这不起作用!?--首选项未保存--即使在同步时也是如此。[[NSUserDefaults standardUserDefaults]stringForKey:key]
与我的原始savePreferences
配对时工作。@bbum。“传入值的可变字符串副本浪费了周期和内存;不需要它。”是的。我不知道为什么会这样。谢谢。鉴于NSUserDefaults和CFPreferences不起作用,我想你的问题在别处;特别是在数据如何首先派生方面。你是否确保你首先将正确的值传递到默认持久性代码中?@bbum,CFPreferences的问题是我在dealloc中保存状态。只要我不这样做,我的代码就可以正常工作。但是我无法让NSUserDefaults正常工作(除了我的loadPreferences,当与我最初基于CFPreferences的SavePreferences函数配对时!).我想接受你的答案,只需要澄清一下!这取决于-dealloc。如果是dealloc,则发生在你的应用程序部分被拆除时(终止或类似情况),那么框架的内部状态可能是未定义的。这就是为什么在dealloc中执行除基本资源获取之外的任何操作都是一个非常糟糕的主意。根据定义,对象图处于不确定状态;您不知道还有什么可能已经被部分或完全拆除或解除分配。