wake-up-neo.com

Init in Unterklasse überschreiben

Müssen in Objective-C alle geerbten Konstruktoren einer Unterklasse überschrieben werden, um eine benutzerdefinierte Initialisierungslogik hinzuzufügen?

Ist beispielsweise Folgendes für eine Unterklasse UIView mit benutzerdefinierter Initialisierungslogik korrekt?

@implementation CustomUIView

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

- (id)initWithFrame:(CGRect)theFrame {
    self = [super initWithFrame:theFrame];
    if (self) {
        [self initHelper];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super initWithCoder:decoder];
    if (self) {
        [self initHelper];
    }
    return self;
}

- (void) initHelper {
    // Custom initialization
}

@end
38
hpique

Jede Cocoa Touch-Klasse (und jede Cocoa-Klasse) verfügt über einen festgelegten Initialisierer. für UIView, wie angegeben in dieser Dokumentation , ist diese Methode initWithFrame:. In diesem speziellen Fall müssen Sie nur initWithFrame überschreiben. Alle anderen Aufrufe werden nach unten kaskadiert und schließlich auf diese Methode angewendet.

Dies geht über den Rahmen der Frage hinaus. Wenn Sie jedoch einen benutzerdefinierten Initialisierer mit zusätzlichen Parametern erstellen, sollten Sie beim Zuweisen von self Folgendes sicherstellen:

- (id)initWithFrame:(CGRect)theFrame puzzle:(Puzzle *)thePuzzle title:(NSString *)theTitle {
    self = [super initWithFrame:theFrame];
    if (self) {
        [self setPuzzle:thePuzzle];
        [self setTitle:theTitle];
        [self initHelper];
    }
    return self;
}
41
Sam Ritchie

Wenn Sie den Interface Builder verwenden, heißt der folgende:

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
       //do sth
    }
    return self;
}
4
letanthang

Im Allgemeinen sollten Sie die angegebene Initialisierungskonvention befolgen. Der festgelegte Initialisierer ist der Init, der die Initialisierung aller Instanzvariablen abdeckt. Der angegebene Initialisierer ist auch die Methode, die von anderen init-Methoden einer Klasse aufgerufen wird.

Apples Dokumentation über bezeichnete Initialisierer.

initWithFrame: ist der angegebene Initialisierer der NSView-Klasse. In der Cocoa-Dokumentation von Apple wird der angegebene Initialisierer einer Klasse immer explizit erwähnt.

initWithCoder: wird diskutiert hier auf SO .

4