2016-09-05 67 views
2

我学习创建Objective-C中一个单独的类和整个这个职位它使用GCD确保Singleton模式的强制执行来了。我对这个类中的实例init方法以及它为什么在那里感到困惑。Objective-C的单例类的实例初始化函数

看起来像有人试图初始化MyManager实例时会调用它,但为什么作者尝试初始化父类的实例([super init])?与ObjC混乱

#import "MyManager.h" 

@implementation MyManager 

@synthesize someProperty; 

#pragma mark Singleton Methods 

+ (id)sharedManager { 
    static MyManager *sharedMyManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedMyManager = [[self alloc] init]; 
    }); 
    return sharedMyManager; 
} 

- (id)init { 
    //what is purpose of initialising parent class (NSObject's) instance 
    if (self = [super init]) { 
     someProperty = [[NSString alloc] initWithString:@"Default Property Value"]; 
    } 
    return self; 
} 

- (void)dealloc { 
    // Should never be called, but just here for clarity really. 
} 

@end 
+1

http://stackoverflow.com/questions/2956943/why -should-I-调用自超init和http://stackoverflow.com/questions/18693023/objective-c-questions-about-self-super-init你的问题是不相关真的单身,因为我们几乎总是在自定义初始化方法中调用[super init]。 – Larme

回答

1

一个细微的一点是,语言没有静态方法。它有类方法

即,通过+前缀方法附着到类对象,并继承和可以被重写一样实例方法。

因此,写一个单身的情况下,单一实例的初始化工作,就像在超类有机会初始化所有其他实例的初始化了。

由于大多数单身从NSObject继承,它是一个无操作。

但是,有时候,你结束了:

NSObject 
    AbstractSingletonThatIsNeverDirectlyInstantiated 
     ConcreteSingletonForLocalOnlyMode 
     ConcreteSingletonForOnlineMode 

(完全是编造的例子,但我已经看到了类似)

+0

虽然所有对象都是从NSObject继承而来的,但是你不应该再继承独立类的子类。你不能保证单例是引用单基类还是一个子类。 (另外,我觉得OP的问题就简单得多了,就问为什么'init'调用'[超级初始化]'。) – Rob

+0

@Rob在这种情况下,AbstractSingleton永远不会被实例化,但两个具体的子类会。而且,是的,有一些模式可以让每个人都漂浮在一起,完全有效。为清晰起见进行编辑。它类似于类集群,但是是单例集群。 – bbum

+0

当然,但即使基础单例是抽象的,你仍然有两个单例子类的问题,因为它们共享'sharedManager'和'onceToken'。因此,只要一个具体的单例被实例化,你就不能正确地实例化另一个具体的子类的单例。基本上,每个单例类都需要自己的'sharedManager'和它自己的'onceToken'(或者抽象基类需要比'dispatch_once'更复杂的东西来实现一些线程安全的单例工厂(!)模式)。 – Rob