【问题标题】:What is SharedInstance actually?SharedInstance 实际上是什么?
【发布时间】:2011-08-01 07:51:57
【问题描述】:

sharedInstance 实际上是什么?我的意思是有什么用途?

目前我在 2 个不同的文件之间进行通信时遇到了一些问题。

这是我的问题:

我有 1 个文件调用 A.h/A.m 和另一个文件调用 B.h/B.mA.h 需要访问B.h 中的一些数据,所以....有什么方法可以实现我想要的吗?

想知道“SharedInstance”能否解决我的问题?

【问题讨论】:

    标签: objective-c ios4 iphone-sdk-3.0


    【解决方案1】:

    共享实例是一个过程,您可以通过它访问项目中任何位置的类的相同实例或对象。这背后的主要思想是每次调用方法时都返回相同的对象,以便可以在应用程序的任何地方使用存储在实例中的值/属性。

    这可以通过以下两个简单的过程来完成:-

    1) 使用只初始化一次的静态变量

    @implementation SharedInstanceClass
    
    static SharedInstanceClass *sharedInstance = nil;
    
    + (id)sharedInstanceMethod
    {
        @synchronized(self) {
            if (sharedInstance == nil) {
                sharedInstance = [SharedInstanceClass new];
            }
        }
        return sharedInstance;
    }
    
    @end
    

    2) 使用 GCD :-

    + (id)sharedInstance{
        static dispatch_once_t onceToken;
        static SharedInstanceClass *sharedInstance = nil;
        dispatch_once(&onceToken, ^{
            sharedInstance = [SharedInstanceClass new];
        });
        return sharedInstance;
    }
    

    这些必须被称为:-

    SharedInstanceClass *instance = [SharedInstanceClass sharedInstance];
    

    因此,每次都会从函数返回相同的实例,并且设置为属性的值将被保留,并且可以在应用程序的任何地方使用。

    问候,

    【讨论】:

      【解决方案2】:

      sharedInstance 有多种用途。

      例如,您可以从静态上下文中访问对象。实际上,它用于支持单例模式的大多数方式。 这意味着在整个程序代码中只使用该类的一个对象,完全只使用一个实例。

      界面可能如下所示:

      @interface ARViewController
      {
      }
      @property (nonatomic, retain) NSString *ARName;
      
      + (ARViewController *) sharedInstance;
      

      实现ARViewController:

      @implementation ARViewController
      static id _instance
      @synthesize ARName;
      ...
      - (id) init
      {
          if (_instance == nil)
          {
              _instance = [[super allocWithZone:nil] init];
          }
          return _instance;
      }
      
      + (ARViewController *) sharedInstance
      {
          if (!_instance)
          {
              return [[ARViewController alloc] init];
          }
          return _instance;
      }
      

      要访问它,请在 CustomARFunction 类中使用以下代码:

      #import "ARViewController.h"
      
      @implementation CustomARFunction.m
      
      - (void) yourMethod
      {
          [ARViewController sharedInstance].ARName = @"New Name";
      }
      

      【讨论】:

      • 好吧,请给我们一些更详细的信息,问题出在哪里,你到底不明白什么:)
      • 好的,我有 2 个文件 - ARViewController.h /.m - CustomARFunction .h /.m 在 ARViewController.h 中,我有一个名为 ARName 的字符串变量。我想要的实际上是在 CustomARFunction.m 中,我需要在 ARViewController.h 中引用 ARName 并对其进行一些更改。意思是,如果我使用 CustomARFunction.m 更改 ARName,ARViewController 处的 ARName 也会更改。
      • 这个答案是错误的,如果实例为nil,则需要在+sharedInstance中进行alloc/init,在init上没办法。
      • Described by "// Some init-code" ;) 不管怎样,我修改了代码
      • - (id)init 没有被调用?!
      【解决方案3】:

      界面

      @interface CouponSynchronizer : NSObject
      
      + (CouponSynchronizer *) sharedSynchronizer;
      
      @end
      

      实施

      @implementation CouponSynchronizer
      
      static CouponSynchronizer *sharedSynchronizer = nil;
      
      + (CouponSynchronizer *)sharedSynchronizer
      {
          @synchronized(self) {
              if (sharedSynchronizer == nil) {
                  sharedSynchronizer = [[self alloc] init];
              }
          }
          return sharedSynchronizer;
      }
      
      @end
      

      【讨论】:

        【解决方案4】:

        sharedInstance 通常使用singleton pattern 实现。就像[UIApplication sharedApplication] -> 只有一个应用程序可以通过这个单例访问。

        这个想法是有一个类的实例,可以通过调用类方法来访问,在objective-c中通常命名为sharedXXX。

        要解决您的问题,您实际上可以实现一个模型类的单例,并在一个现有实例中写入和访问日期,该实例可以使用静态方法访问,我们称之为 sharedModel。

        改进模型和更新视图的下一步是 KVO:Key Value Observing。您在 viewController 中添加一个观察者来“观察”对模型所做的更改。如果发生此类更改,您的 viewController 会被通知,然后您可以更新视图。

        您可以在Apple's documentationmindsizzlers 阅读有关 KVO 的更多信息,以获取一个小而简单的教程。

        【讨论】:

          猜你喜欢
          • 2021-05-12
          • 2011-12-26
          • 1970-01-01
          • 2018-09-26
          • 2011-03-11
          • 2010-11-26
          • 2015-06-23
          • 2018-08-08
          • 2017-12-26
          相关资源
          最近更新 更多