覆盖init方法以获得单例实例

时间:2015-07-08 13:08:12

标签: ios objective-c cocoa-touch singleton

一个第三方库使用我的类初始化:

ClassA *a = [[MyClass alloc] init]];

我需要MyClass作为共享实例(也称为singleton),但我无法修改执行MyClass初始化的第三方方式

我试图覆盖init方法如下:

- (instancetype)init
{
    return [[self class] sharedInstance];
}

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

但遗憾的是,new导致alloc init被执行。

我知道最简单的方法是有两个单独的类:

  • MyClass将通过alloc init
  • 进行初始化
  • 单独MySharedClass单身

是否有可能只用一个班级来实现这个目标?

2 个答案:

答案 0 :(得分:0)

继承怎么样,

创建一个名为ChildClass的新类,它继承自MyClass并添加以下两个方法

+ (instancetype)sharedInstance
{
    static ChildClass *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
       sharedInstance = [[ChildClass alloc] init];
    });

    return sharedInstance;
}

- (id)init
{
    self = [super init];
    return self;
 }

答案 1 :(得分:0)

试试这个。它肯定会解决你的问题。

- (instancetype)init
{
    return [[self class] sharedInstance];
}

+ (LoopMeNativeEvent *)sharedInstance {

    // structure used to test whether the block has completed or not
    static dispatch_once_t onceToken = 0;

    // initialize sharedObject as nil (first call only)
    static LoopMeNativeEvent *_sharedInstance = nil;

    // executes a block object once and only once for the lifetime of an application
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[LoopMeNativeEvent alloc] init];
    });

    // returns the same object each time
    return _sharedInstance;
}