我有一个小值需要通过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,但也许有一些问题或性能考虑与此,我忽略了。感谢您的反馈/关注。
问题
这是可以接受的做法吗?这会在以后造成问题吗?
你这样做是可以的,但是有一些你应该意识到的暗示。
NSUserDefaults是基于磁盘的存储。因此,它比基于内存的解决方案要慢得多。在iOS上,"基于磁盘的"是指闪存,它仍然比基于内存的存储慢得多。
闪存在失败之前也有有限的写周期。
由于这两个原因,我不会对快速变化的值或需要快速响应的值使用上述技术。
而且,我假设既然你说"…"你的意思是在多个对象之间共享。
我建议确保在你的头文件中记录这些属性,以便清楚地表明它们是共享的、持久的属性。除了在标题中添加描述性文本外,在这些属性名称中添加"shared"或"saved"字样也会有所帮助。
如果您的唯一需求是共享访问,并且您不需要持久性,那么您可能会考虑使用数据容器单例而不是使用用户默认值。(你创建了一个拥有你想要共享的属性的单例对象,然后你从应用程序的任何地方获取一个指向该单例对象的指针,并使用它来读写你想要共享的属性。)
您甚至可以使用混合方法,在单例中收集这些属性,并在单例中实现持久性。这样做的优点是将保存/读取逻辑集中在一个地方,因此如果您决定在将来的某个日期更改它以使用不同的存储方法。
我个人认为,在您希望使用的过程中获取默认值要好得多。所以:
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSString* myValue = [defaults stringForKey:@"mykey"];
//manipulate myValue;
…你可以在代码中清楚地看到你的意图。
没有技术上的理由不这样做。有些人会告诉您,一个属性可能会向其他开发人员发出信号,表明它是一个简单的getter/setter,而不是调用从硬盘驱动器或远程服务器读取数据的东西。
它可以取决于上下文——也许如果你以一种方式命名你的类,表明它是某种与存储绑定的对象,这将是更好的。除非过度使用属性(在内部循环中,在计算中多次检索它而不是使用变量等),否则不会出现性能问题。否则,我会使用两个方法,在它们的名字前加上"load"/"read"one_answers"save"/"write"前缀,这样其他开发人员就知道他们应该缓存这些值,只有在需要最新数据时才调用它们。
编辑:在99%的情况下,你可以做你所描述的。就我个人而言,这就是我所做的,但我认为你应该意识到我在回答中所描述的担忧。