我正在学习在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
答案 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
(完全是一个例子,但我见过类似的。)