【问题标题】:NSUserDefaults IOS Accessible Everywhere?NSUserDefaults IOS 无处不在?
【发布时间】:2012-08-10 00:31:23
【问题描述】:

我想知道 NSUserDefaults 对象是否是共享的,并且可以从应用程序委托以及我的几个视图控制器中访问。基本上我需要从应用程序委托来回传递数据到视图控制器。我不想使用单例。我想知道 NSUserDefauflts 对象是否是一种方法。

如果这是可能的,我将如何初始化对象以使其成为可能?

谢谢!

【问题讨论】:

  • 在这种情况下 plist 会更好吗?

标签: objective-c ios singleton nsuserdefaults


【解决方案1】:

如果只使用[NSUserDefaults standardUserDefaults],每次都会返回同一个实例。然后不同的类可以使用它来存储跨会话持久的数据。

如果您只是想在应用程序的各个部分之间传递数据,而不是存储它,那么用户默认设置不是这样做的合适方式。您应该在您的类上公开方法或属性,这些方法或属性将您需要传递的数据作为输入。

【讨论】:

  • +1 比我快。依赖注入是可行的方法,将数据传递给需要它的类,并且更喜欢自定义初始化器而不是类/视图正常工作所需的值的属性。
  • 传递给类涉及在我的位置从视图控制器转换为应用程序委托...因为我需要一些东西才能在应用程序委托中工作...实际上只是使用 nsuerdefaults 因为我将使用它无论如何对于其他数据存储......所以我想要一个统一的系统类型,视图控制器可以访问很多,[NSUserDefaults standardUserDefaults]听起来真的很好......他们什么时候初始化?他们总是在身边吗?它会在不同的会话中维护数据吗?它会以某种方式与文件系统交互吗?
  • @user1392515 这在documentation 中有介绍。简短的回答是当你需要它时,是的。
  • @user1392515:听起来您倾向于使用NSUserDefaults 在对象之间传递数据。我不能阻止你,但我可以告诉你,这样做不会有好处。
【解决方案2】:

嗯,它是,但这并不是它的设计目的。正常的设计模式是“手动”在视图控制器之间来回传递对象。您希望您的视图控制器尽可能独立于应用程序的其余部分——可重用。将它们绑定到 NSUserDefaults 并不是一个好方法!

【讨论】:

    【解决方案3】:

    您不应该在您的应用委托中进行任何处理。理想情况下,您应该初始化您的窗口、根视图控制器(如果不是通过情节提要执行此操作)和模型,仅此而已。所有处理都应该在其他地方完成(主要是在与模型类对话的视图控制器中)。

    使您的根模型类成为单例,以便您的所有视图控制器都可以通过您选择的接口与其通信。

    制作单例并不难:

    @interface MyModel: NSObject
    
    + (MyModel *)sharedModel;
    
    @end
    

    和实施:

    @implementation MyModel
    
    + (MyModel *)sharedModel
    {
        static MyModel* modelSingleton = nil;
        static dispatch_once_t once;
        dispatch_once(&once, ^{
            modelSingleton = [[MyModel alloc] init];
        });
    
        return modelSingleton;
    }
    
    @end
    

    然后你只需使用:

    [MyModel sharedModel]
    

    访问它。

    【讨论】:

    • 感谢答案...但我害怕很多单身人士(我不太了解他们)
    • 单例基本上提供了访问单个对象的方法或函数。通过函数或方法,您可以控制您创建的对象的实例数(在本例中为 1)。 dispatch_once 东西做了两件事:确保它只运行一次,并确保它是线程安全的。这意味着如果多个线程同时调用 sharedModel,我们仍然只能得到一个实例。
    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2014-11-18
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    相关资源
    最近更新 更多