Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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
Ios 直接在自定义Getter/Setter中设置nsuser默认值_Ios_Objective C_Properties_Nsuserdefaults - Fatal编程技术网

Ios 直接在自定义Getter/Setter中设置nsuser默认值

Ios 直接在自定义Getter/Setter中设置nsuser默认值,ios,objective-c,properties,nsuserdefaults,Ios,Objective C,Properties,Nsuserdefaults,因此,我有一个小值需要通过NSUserDefault在我的应用程序中同步。我发现自己从NSUserDefaults中保存并获取了一些值,我认为将Getter/Setter直接链接到NSUserDefaults可能会更好 下面是我的Getter/Setter代码: - (void) setSomeProperty:(id)someValue { [[NSUserDefaults standardUserDefaults]setObject:someValue forKey:@"somePr

因此,我有一个小值需要通过NSUserDefault在我的应用程序中同步。我发现自己从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* defaults = [NSUserDefaults standardUserDefaults];

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

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

没有技术原因不这样做。有些人会告诉您,某个属性可能会向其他开发人员发出信号,表示它是一个简单的getter/setter,而不是调用硬盘或远程服务器读取的内容

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


编辑:不过,对于99%的情况,您可以按照您所描述的做。就我个人而言,这就是我所做的,但我认为你应该意识到我在回答中描述的问题。

你所做的是可以的,但有一些你应该意识到的含义

NSUserDefault是基于磁盘的存储。因此,它比基于内存的解决方案要慢得多。在iOS上,“基于磁盘”意味着闪存,它仍然比基于内存的存储慢很多

闪存在发生故障之前的写入周期数也是有限的

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

另外,我假设既然你说“…在我的应用程序中同步…”,你的意思是在多个对象之间共享

我建议确保在标题中记录这些属性,这样就可以清楚地看到它们是共享的、持久的属性。除了标题中的描述性文本外,在这些属性名称中添加“共享”或“保存”字样也会有所帮助

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


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

我也这样做。我从来没有看到过问题。我认为这样做是完全可以的,只是在将值保存到时应该调用synchronizedefaults@AndreyChernukha您不需要每次设置值时都调用
synchronize
。操作系统有时会自动同步默认值。谢谢@rmaddy,我现在可以放心地继续了@rmaddy如果要确保始终保存该值,请调用
同步
。如果在调试时使用Xcode终止应用程序,或者在更改值后不久应用程序崩溃,除非调用
synchronize
,否则它可能不会始终保存。不过,我同意这不是必需的。调用
someClass.someProperty
的抽象可以使代码看起来更干净,更易于阅读。此外,它还减少了您可能意外键入
@“myKey”
而不是
@“myKey”
的位置,并使维护更简单。我想,这是有道理的。不过,我通常在一个常量文件中有键。使用属性来设置某些东西的先例不是简单的getter/setter,而是与存储相关的:核心数据模型对象。我认为使用
NSUserDefaults
也可以完全接受,因为开销非常小。只有当您开始在
NSUserDefaults
中存储大量数据,或者在循环中多次设置内容时,您可能会遇到问题,但大多数情况下您根本不必担心。@Gavin我同意,编辑了我的评论。另外,CoreData是否会缓存对NSManagedObject的更改,然后在调用某些特定函数时提交这些更改?我不认为属性实际上与存储绑定在一起,当您为属性设置新值时会对其进行修改。。但我已经有一段时间没有使用CoreData了……感谢Duncan,它已经被设置为会话资源的单例,只是将它用于几个需要在应用程序关闭时保存的值!缓存系统也是闪存,还是只是同步过程?iOS中的所有持久存储都是闪存。这就是iOS中“硬盘”的用途。