Objective-C Singleton类实例初始化函数

时间:2016-09-05 16:07:58

标签: objective-c singleton

我正在学习在Objective-C中创建一个单例类,并且遇到了这个使用GCD来确保强制执行单例模式的帖子。我对这个类中的实例init方法及其原因感到困惑。

当有人试图初始化MyManager实例时,看起来会调用它,但为什么作者试图在这里初始化父类的实例([super init])?

#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 个答案:

答案 0 :(得分:1)

与ObjC混淆的一个微妙之处是该语言没有静态方法。它有类方法

也就是说,以#include <QtGui> #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QDialog(parent) { showMaximized(); A = new FiniteElements; B = new QwtBeginner; browseButton = createButton(tr("&Open"), SLOT(browse())); QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(B, 0, 0); mainLayout->addWidget(browseButton, 0, 1); setLayout(mainLayout); setWindowTitle(tr("L4V14_oapsois by Mikhail Krishtop")); } void MainWindow::browse() { QString filepath = QFileDialog::getOpenFileName(this,tr("Select input datafile"),QDir::currentPath()); if (!filepath.isEmpty()) { std::string str = std::string(filepath.toAscii().data()); const char * stuff = str.c_str(); A->SetFN(stuff); A->evaluate(); B->eval(A->GetXArray(),A->GetYArray(),A->GetN(),A->GetTriangles(),stuff, A->GetTArray(),A->GetX(),A->GetY(),A->GetResultTemp()); } } QPushButton *MainWindow::createButton(const QString &text, const char *member) { QPushButton *button = new QPushButton(text); connect(button, SIGNAL(clicked()), this, member); return button; } 为前缀的方法附加到Class对象并被继承,并且可以像实例方法一样被覆盖。

因此,在编写单例时,单例实例的初始化就像每个其他实例初始化一样,因为超类也有机会进行初始化。

由于大多数单身人士都是从+继承的,所以这是一个无操作。

但是,有时,你最终得到:

NSObject

(完全是一个例子,但我见过类似的。)