从Class方法中访问sharedInstance

时间:2014-03-17 14:36:16

标签: ios objective-c singleton class-method

我正在将项目转换为SDK。我需要将几个实例方法转换为类方法。我收到了关于使用" self"的编译器警告。警告是"不兼容的指针类型初始化Store *,表达式为Class。此Store类是singleton sharedInstance。

我在班级商店中有这样的方法:

+ (void) dispatchStoreSource {

__weak Store *ref = self;  <--- issue is here

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSError *error = nil;
    NSArray *things = [ref fetchThings:&error];

    //dispatch back to main queue
    if (![ref updateSource:source forUser:user error:&error]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            result(nil, error);
        });
    } else {
        dispatch_async(dispatch_get_main_queue(), ^{
            result(source, nil);
        });
    }
  });


}

解决此问题的正确方法是什么?我应该这样做吗?

 __weak Store *ref = [Store sharedInstance];

2 个答案:

答案 0 :(得分:2)

您的ref是指向Store类对象的指针。但是你的类方法中的self并不指向类的分配对象(=你的单例),它是你的类,IOW Store(不是对象,而是Class)。如果你已经实现了sharedInstance类方法,就像这样......

+ (instancetype)sharedInstance {
  static Story *instance;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    instance = [[self alloc] init];
  });
  return instance;
}

...只需执行此操作ref = [self sharedInstance];

答案 1 :(得分:0)

是的,您应该使用__weak Store * ref = [Store sharedInstance];

否则,让我们使用Store的原始静态参考。

示例:

  static Store = _store = nil;

  __weak Store * ref = _store;