5 Stimmen

Endlosschleife bei Verwendung von loadView

Sehr interessantes Problem bei der Verwendung von loadView in UIViewController.

Normalerweise haben wir das so gemacht

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    NSLog(@"loadview");
    [super loadView];
}

Wenn entfernen

 [super loadView];

Damit kommen wir in die Sackgasse

- (void)loadView {
    NSLog(@"loadview");

}

Warum?

9voto

Jlexyc Punkte 507

Nur ein Weg, um Endlosschleife in diesem Fall zu machen - ist immer Ansicht Eigenschaft, bis seine nicht gesetzt. Wenn Sie nächste (zum Beispiel) schreiben:

- (void)loadView {
   self.view = [[UIView alloc] initWithFrame:self.view.bounds];
}

Sie werden eine Endlosschleife haben, aber

- (void)loadView {
   self.view = [[UIView alloc] initWithFrame:CGRectZero];
}

funktioniert gut.

Sie können also nicht auf die Ansichtseigenschaft zugreifen, solange Sie sie nicht festgelegt haben.

4voto

petershine Punkte 3150

Da Sie nur ERBEN, was in der Superklasse (UIViewController) implementiert wird, wenn Sie keine Supermethoden aufrufen, wird die Implementierung, die durchgeführt werden muss, NICHT durchgeführt.

Fast alle Supermethoden tun etwas Kritisches, und die Implementierungen der lokalen Klasse, die die Superklasse erbt, müssen sie entweder alle zusammen überschreiben (es sei denn, man weiß alles darüber, was Super tut, indem man sich auf die Dokumentation bezieht, was nie eine gute Idee ist), oder einfach die Implementierung der lokalen Klasse zu den Implementierungen der geerbten Superklasse hinzufügen.

Zusammenfassend lässt sich sagen, dass Sie, wenn Sie eine Klasse erben, was in den meisten Fällen der Softwareentwicklung der Fall ist, die Implementierung der Superklasse überlassen sollten, es sei denn, es ist sicher, sie zu überschreiben.

Wenn ich richtig liege, scheint es, dass super loadView etwas sehr Kritisches implementiert, um die Schleife zu vermeiden.

ZUSÄTZLICHE ANMERKUNG: Aus der Dokumentation geht jedoch hervor, dass Sie sollte nicht Super-Methode aufrufen: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html Der Grund für die Endlosschleife ist wahrscheinlich die fehlende Implementierung von view Eigenschaft angemessen zu berücksichtigen.

2voto

er0 Punkte 1611

Wenn Sie loadView überschreiben, wird von Ihnen erwartet, dass Sie eine Root-View für die View-Hierarchie des Controllers bereitstellen. Wenn Sie diese nicht bereitstellen, wird loadView jedes Mal aufgerufen, wenn die Ansicht referenziert wird, was möglicherweise zu einer Endlosschleife führt. Aus den Docs:

Wenn Sie die Ansichten manuell angeben, müssen Sie die loadView-Methode implementieren und sie verwenden, um der Eigenschaft view ein Root-View-Objekt zuzuweisen.

Implementierungen, die eine Endlosschleife verursachen würden:

- (void)loadView {
    NSLog(@"loadview");
}

...self.view ist nach loadView gleich Null

- (void)loadView {
   self.view; // Or anything that references self.view
}

...der Verweis auf self.view führt zum Aufruf von loadView und damit zu einer Endlosschleife.

Richtig:

- (void)loadView {
    self.view = [[UIView alloc] init];
    if (self.view == nil) {
        [super loadView]; // Try to load from NIB and fail properly, also avoiding inf. loop.
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X