【问题标题】:Flexible way to pass references in Objective-C (iPhone)?在 Objective-C (iPhone) 中传递引用的灵活方法?
【发布时间】:2010-01-16 23:04:34
【问题描述】:

在 Objective-C 中获得对“单例”对象的引用的好方法是什么?请注意,具体来说,我指的不是单例模式,而是指通常只有一个实例的对象。这特别适用于应用程序模型。例如,在一个烹饪应用程序中,我想要一个类 (RecipeModel),它可以为我提供系统中所有“Recipe”对象的 NSArray。

我不想每次都从持久存储中加载它们——加载它们一次然后将它们缓存在内存中(换句话说,在这个类的一个变量中)是有意义的。如果我这样做,我的几个类可能需要一种方法来访问这个实例。

最灵活的方法是什么?这是我能想到的所有选项。

  1. 使用 +(RecipeModel *) sharedRecipeModel 方法使 RecipeModel 成为真正的单例
  2. 使 allRecipes NSArray 可通过类方法访问。然后每个 viewController 可以创建一个新的 RecipeModel 并获得相同的(静态/全局)数据。 +(NSArray *) 所有食谱
  3. 在 appDelegate 中创建它并使用 sharedApplication 获取对它的引用
  4. 确保一切都在界面生成器中,并使用 IBOutlet 将类的副本传递给我的 viewController

在其他平台 (flex) 上,我会使用 DependencyInjection 或 MVC 框架来处理这种连接。我读过objective-c 不需要DI 框架,因为它有类别。我知道的不够多,无法评估,但类别当然不能解决这个问题。

【问题讨论】:

标签: iphone objective-c model-view-controller architecture dependency-injection


【解决方案1】:

选择 1,有一个像 RecipeProvider 这样的类,它的 allRecipes 类方法返回一个包含所有食谱的数组。在该方法中,您可以进行加载/缓存/更新处理。要跟踪数据和状态,请在您的 RecipeProvider 类(非线程安全)或直接在 allRecipes 函数中使用静态变量。

【讨论】:

    【解决方案2】:

    我认为你把事情复杂化了。

    当您只需要一个所有其他对象都可以访问的通用集合对象时,没有理由创建单例类。

    授予对某个对象的通用访问权限的最佳方法是将其停放在应用程序委托中。在你建议的情况下,你会有类似的东西:

    @interface mytAppDelegate : NSObject <UIApplicationDelegate> {
       NSMutableArray *recipies;
    ...
    

    然后您可以在应用中的任何位置调用:

    UIApplicationDelegate *appDelegate=[[UIApplication sharedApplication] delegate];
    RecipeObj *aRecipe=[appDelegate.recipes objectAtIndex:someIndexValue];
    

    不要大惊小怪,不要大惊小怪。

    如果您使用的是 Core Data,您可以将 NSManagedObjectContext 对象放在应用程序委托中并直接访问它。 Core Data 进行了巨大的优化,使其与更原始的手卷方法一样快。我不会费心尝试创建一个单独的数组,除非您测试并发现直接核心数据会变慢。在你给的情况下,它不会。

    【讨论】:

    • 这对于小型项目来说是一个好方法,但它无法扩展,因为在大型项目中,您的应用程序委托中会有太多垃圾,同样,我想要一种封装数据逻辑的方法。所以,你的建议是我倾向于的,但不是拥有那个数组,而是引用一个加载并提供该数组的类。
    • 是的,您可以重载应用委托。首选方法是创建一个类来管理您的数据模型,然后将其作为 iVar 存放在应用程序委托中。这使得数据模型在项目之间非常可移植。我自己使用这种方法。如果您有一个复合模型,例如一些数据存储在 Core Data 中,一些存储在文件中。
    【解决方案3】:

    我不确定是否有一种正确方法可以做到这一点,当然你所有的选择都是可行的。我个人的偏好是为我的数据存储创建一个单例对象,并从中添加方法来访问“重要的东西”;在这种情况下,食谱列表。

    【讨论】:

      【解决方案4】:

      我使用应用程序委托来存储对UIFontUIColor 实例的引用,为用户界面创建事实上的“样式”。其他控制器通过委托访问这些实例。这对他们来说是一个好地方,因为应用程序委托本质上已经是一个单例,而且对于特定于应用程序的实体来说,这是一个明智的地方。

      如果您认为将其与应用程序委托分开更明智,您也可以创建一个 RecipeModel 单例。这将实现相同的目标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        • 2012-12-11
        相关资源
        最近更新 更多