【问题标题】:How to check if JSONModel class was initialized in Objective-c?如何检查 JSONModel 类是否在 Objective-c 中初始化?
【发布时间】:2017-03-09 21:21:48
【问题描述】:

我的 Objective-c 应用程序中有一个 JSONModel 类。我将此类与单例一起使用,然后使用以下代码初始化此类:

MyClass *client = [[MyClass alloc] init];
client = [[MyClass alloc] initWithDictionary:myDictionary error:nil];

.h

@interface MyClass : JSONModel
...
+ (id)sharedInstance;
...
@end

.m

static MyClass *singletonObject = nil;

+ (id) sharedInstance
{
    if (! singletonObject) {

        singletonObject = [[MyClass alloc] init];
    }
    return singletonObject;
}

- (id)init
{
    if (! singletonObject) {
        singletonObject = [super init];
    }
    return singletonObject;
}

我正在尝试检查我是否已经像这样初始化了我的类:

if([MyClass sharedInstance] == nil){

但它不起作用...如何检查是否已初始化?

【问题讨论】:

  • 当然这不起作用——sharedInstance 在返回之前初始化对象,如果它是nil。这感觉就像X/Y problem;你想做什么?
  • 我在通话中使用从服务器接收到的数据初始化 MyClass,但是我想删除它并重新调用,所以我正在检查什么时候是空的来进行通话,什么时候没有,希望清楚跨度>
  • 我真的不确定你在这里做什么。为什么你甚至需要一个单例?另外,您的 init 方法中发生了什么?我认为您甚至可能违反了内存管理约定,这最终会导致非常奇怪的错误。
  • 有数百万个关于如何在 Objective-c 中实现单例的示例。为什么不只是复制一个而不是发明你自己的,你发现这是行不通的。不,您的评论根本不清楚。
  • 我复制了我的单身人士。我的单例工作正常,因为我可以使用 [MyClass sharedInstance] 从另一个类加载 MyClass 并且它可以工作,但我想在一个类中销毁它以检查其他类中是否为空并再次调用服务器.. 感谢您的回答

标签: ios objective-c null singleton jsonmodel


【解决方案1】:

通常要初始化一个单例,你使用一个类方法(在这个例子中是sharedInstance),并且在那个类方法中,你init你的类,如果它是nil。然后像这样调用其他任何地方来访问它。

MyClass *yourMom = [MyClass sharedInstance];

// you can use yourMom from now

只要应用没有终止,它就会一直保留在内存中。

【讨论】:

    【解决方案2】:

    我认为我们需要在这里回归基础。从 init 方法返回单例并不是一个好主意,这就是您的 sharedInstance 类方法的用途。一般来说,方法应该总是完全按照他们所说的去做,因此没有更多的 init 方法来初始化(init)一个新实例,而不仅仅是返回一个单例。静态变量也应该在类方法中声明。这通常是这些类型的方法的使用方式,但正如其他人所说,我们确实需要知道您所追求的行为类型以及原因。

    【讨论】:

      【解决方案3】:

      如果你想创建一个单例,这里是一个例子:

      .h

      @interface MyClass : JSONModel
      ...
      @property(strong, nonatomic) Blah *blah; //NSMutableDictionary if you are trying to store JSON
      
      + (id)sharedInstance;
      ...
      @end
      

      .m

      + (id) sharedInstance {
          @synchronized(self) {
              if (! singletonObject) {
                  singletonObject = [[MyClass alloc] init];
              }
              return singletonObject;
          }
      }
      
      //getter
      - (Blah *)blah {
          if (!blah) {
              blah = [[Blah alloc] init];
          } 
          return blah;
      }
      

      你想将你的 JSON 存储到那个单例中???

      MyClass *client = [MyClass sharedInstance];
      client.blah = ...//your JSON dictionary or something else. This can be used as a global variable.
      

      我不确定你在这里要做什么,我不知道你为什么想要一个单例,你希望它作为一个全局变量存储你的 JSON 模型以在整个应用程序中使用吗?

      【讨论】:

      • 我想要一个单例,因为我想从另一个类中获取我的 JSONModel,内容由 json 初始化,但是如果我的内容发生变化,我会返回我初始化我的类的第一个类,这不会重新加载, 因为它已经添加了 json..
      【解决方案4】:

      每次您使用alloc/init 时,您只是在创建另一个实例,而不是使用共享实例。如果您想以不同于 init 的方式初始化共享实例,请尝试以下操作:

      MyClass *client = [MyClass reinitSharedInstanceWithDictionary: myDictionary];
      

      .h

      @interface MyClass : JSONModel
      ...
      + (id)sharedInstance;
      + (id)reinitSharedInstanceWithDictionary:(NSDictionary*)dict;
      ...
      @end
      

      .m

      static MyClass *singletonObject = nil;
      
      + (id) sharedInstance
      {
          if (! singletonObject) {
      
              singletonObject = [[MyClass alloc] init];
          }
          return singletonObject;
      }
      
      + (id) reinitSharedInstanceWithDictionary:(NSDictionary*)dict
      {
          singletonObject = [[MyClass alloc] initWithDictionary:dict error:nil];
          return singletonObject;
      }
      
      - (id)init
      {
          if (! singletonObject) {
              singletonObject = [super init];
          }
          return singletonObject;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-25
        • 2011-04-10
        • 1970-01-01
        • 2017-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多