代码之家  ›  专栏  ›  技术社区  ›  Kenny Winker

在-(void)dealloc中同步NSUserDefaults是不是错误的形式?

  •  7
  • Kenny Winker  · 技术社区  · 14 年前

    我在对象的init方法中从NSUserDefaults加载。 我可以在对象的dealloc方法中保存为NSUserDefaults吗?

    完全像:

    -(void)dealloc {
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        [userDefaults setObject:self.filenamesArray forKey:self.defaultsKey];
        [userDefaults synchronize];
        self.filenamesArray = nil;
        self.defaultsKey = nil;
        [super dealloc];
    }
    

    好的,坏的,好吗?如果不好,哪里更好。

    编辑:

    谢谢你的详细回复。所有这些都有道理。我发现为什么这里不适合保存为用户默认值的另一个原因是,只有当对象很好地释放时才会调用dealloc。如果我的应用程序被终止,则此代码永远不会运行。同样,如果应用程序被推到后台(iOS 4),则不会运行。 我也删除了 [userDefaults synchronize] 打电话来。这让我有点紧张,但我把我对苹果的信任放在了这个上面。:)

    2 回复  |  直到 14 年前
        1
  •  7
  •   Joshua Nozzi    14 年前

    这很糟糕,因为在调用-dealloc时,其他对象已经放弃了对它的兴趣。这可能有很多不同的含义。

    设置用户默认值的最佳位置是设置更改的时刻。这样它就可以立即持久化,应用程序可以被终止,而不必担心设置没有持久化,因为对象图的某些部分可能已经消失了。

        2
  •  0
  •   Jared Pochtar    14 年前

    同步-dealloc中的用户默认值与其他任何地方都一样。这是因为,尽管看起来很疯狂,但是DEOLLC没有任何神奇之处,而不像C++的析构函数,-DELoLC实际上就是一个典型的方法。您可能会稍微担心将self.filenamesArray传递给userDefualts,因为这实际上可能是在实际释放之后保留的,但我相信用户默认值会保留它。

    至于你什么时候该 [userDefaults synchronize]; ,人们各不相同,我个人不同意@Joshua——我从不显式地同步,而是让NSUserDefaults来处理它。除非我大错特错,否则它会在应用程序关闭时自动触发,否则会定期触发。它知道自己什么时候更新了,而且需要一次写入整个plist文件,我想我宁愿让Apple的algos在它写入默认值的时候处理,因为它需要非常多的时间(因为它写入文件系统)。

    (请注意,如果您在用户默认值周围有特殊情况,例如另一个应用程序正在读/写它们,则最后一段中的任何一段都不适用)