在自定义Getter / Setter中直接设置NSUserDefaults

时间:2014-03-10 16:25:10

标签: ios objective-c properties nsuserdefaults

所以我有一个小值,需要通过NSUserDefaults在我的应用程序中同步。我发现自己保存并从NSUserDefaults获得了一些价值,我认为将Getter / Setter直接链接到NSUserDefaults可能会很好。

这是我的Getter / Setter代码:

- (void) setSomeProperty:(id)someValue {
    [[NSUserDefaults standardUserDefaults]setObject:someValue forKey:@"someProperty"];
}

- (id) someProperty {
    return [[NSUserDefaults standardUserDefaults]objectForKey:@"someProperty"];
}

以下是我如何访问:

someClass.someProperty = @"SomeValue"; // -- Set's To @"SomeValue"

id someValue = someClass.someProperty; // -- Assigns Value From NSUserDefaults

这样,当我更新或检索属性时,它总是直接访问NSUserDefault值。对我来说,这似乎是一种更简单的方式来写入和检索来自我的NSUserDefaults的值,但也许有一些问题或性能考虑因素我忽略了。感谢您的反馈/关注。

问题

这是可以接受的做法吗,这会在以后引起问题吗?

3 个答案:

答案 0 :(得分:1)

就个人而言,我发现在您希望使用的过程中获取默认值要好得多。所以:

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

NSString* myValue = [defaults stringForKey:@"mykey"];
//manipulate myValue;

...您可以在代码中清楚地看到自己的意图。

答案 1 :(得分:1)

没有技术理由不这样做。有些人会告诉你,一个属性可能会向其他开发人员发出信号,告知它是一个简单的getter / setter,而不是从硬盘驱动器或远程服务器调用读取的东西。

它可能取决于上下文 - 也许如果你以一种传达方式命名你的类,它是某种与存储相关的对象,它会更好。除非过度使用属性(在内部循环内部,在计算中多次检索而不是使用变量等),否则不会出现性能问题。否则我会使用2个方法而不是“load”/“read”和“save”/“write”前缀到它们的名称,以便其他开发人员知道他们应该缓存值并且只在需要数据时调用它们到目前为止。

编辑:但是,对于99%的情况,你可以按照你的描述做得很好。就我个人而言,我认为你应该知道我在答案中描述的问题。

答案 2 :(得分:1)

你正在做的事情还可以,但有一些你应该注意的含义。

NSUserDefaults是基于磁盘的存储。因此,它比基于内存的解决方案慢得多。在iOS上,"基于磁盘的"表示闪存,它仍然比基于内存的存储慢得多。

闪存在失败之前也有有限的写周期。

出于这两个原因,我不会将上述技术用于快速变化的值,或者需要快速响应的值。

另外,我假设你说'#34; ...在我的应用程序中同步..."你的意思是在多个对象之间共享。

我建议您确保在标题中记录这些属性,以便明确它们是共享的持久属性。添加单词" shared"或"已保存"除了标题中的描述性文本之外,这些属性名称将是一个帮助。

如果您的唯一要求是共享访问,并且您不需要持久性,那么您可能会考虑使用数据容器单例而不是使用用户默认值。 (您创建一个具有要共享的属性的单例对象,然后从应用程序中的任何位置获取指向单例的指针,并使用它来读取/写入要共享的属性。)

您甚至可以使用混合方法,在单例中收集这些属性,并在单例中实现持久性。这样做的好处是可以将保存/读取逻辑集中在一个位置,因此如果您决定在将来的某个日期,可以将其更改为使用不同的存储方法。