Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在dealoc中保存对象状态不会';行不通_Iphone_Objective C_Release_Dealloc - Fatal编程技术网

Iphone 在dealoc中保存对象状态不会';行不通

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

我刚才注意到,当我在dealloc方法中保存对象状态(
@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中执行除基本资源获取之外的任何操作都是一个非常糟糕的主意。根据定义,对象图处于不确定状态;您不知道还有什么可能已经被部分或完全拆除或解除分配。