Frage

(Nur Sie lassen jetzt lerne ich mit einem Buch für das iPhone zu entwickeln, habe ich Anfang iPhone 3 Entwicklung genannt: Erforschung des SDK, und ich weiß nicht Interface Builder verwenden) Gibt es überhaupt einen Grund, den Getter in der gleichen Klasse zu verwenden, wenn ein privates Mitglied sichtbar ist? Wie in foo.h, mit

NSObject *myObj;
...
@property (nonatomic, retain)NSObject *myObj;

und dann in Foo.m, den Zugriff auf das Element myObj mit self.myObj (oder [self myObj])? Denn in meinem Buch, Hier ist, was es Sie in eine der Anwendungen (deren Prüfung, ob eine Ansicht des UIViewController Mitglied ist in der Superview) zu schreiben, sagt:

if(self.yellowViewController.view.superview == nil) {

(man beachte die self .yellowViewController ...) Gibt es eigentlich einen Grund dafür? Wenn es nicht eine Idee ist, ich habe, ist vielleicht, weil das Mitglied blueViewController der Klasse BlueViewController ist, so dass ich denke, wenn es keinen Grund gibt, kann es nicht zu Verwechslungen führen sein. So ist es jederzeit, wo unter Verwendung der Getter in der gleichen Klasse benötigt?

Danke !!

War es hilfreich?

Lösung

Ja, Sie ivars durch einen Getter Zugriff als direkt ist eine gute Sache zu tun.

Als Beispiel:. Einer der normalen Design prasselt in Cocoa (vor allem am Telefon, wo die Ressourcen sehr begrenzt sind) ist ein träges Laden genannt

Zusammengefaßt, es bedeutet, laden nicht eine Ressource, bis Sie es brauchen.

Im Idealfall würden Sie Code in Ihre Getter zu setzen, die die Ressource zu sehen, würde überprüfen, ob angefordert wird geladen, und wenn nicht, laden Sie es. Zugriff auf die Ivar direkt würde nur Null zurück. Die Alternative wäre, all die ivars zu initialisieren, wenn Ihre Eltern Klasse init'ed, wodurch potenziell Ressourcen zum Speichern von Daten verschwenden, die nicht benötigt werden oder nicht.

Auf diese Weise können Sie auch potenziell Ressourcen setzen, die möglicherweise wieder in Ihre applicationDidReceiveMemoryWarning: Methoden abgerufen werden konnte und sie entleeren, wenn Ressourcen bekam eng, weil sie wieder bei Bedarf geladen werden, wenn nötig.

Andere Tipps

Lazy Loading Getter:

- (UIImageView*) getImageView
{
    if (!imageView)
    {
        imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"blah.png"]]; // just an example
    }
    return imageView;
}

Je nachdem, wie Imageview definiert ist (kopieren, zuweisen, behalten) Sie die aktuelle Zuordnung ändern müssen, aber das ist, was durch verzögertes Laden gemeint ist.

Ein paar Gründe, die self.ivar Getter-Syntax zu verwenden, anstatt direkt die Instanz-Variable zugreifen:

  • Lazy-Laden Eigenschaften, wie andere erwähnt haben
  • Subklassen möchte die Eigenschaft außer Kraft zu setzen und den übergeordneten Klasse Respekt, dass
  • Wenn Sie atomare Eigenschaften verwenden, die einzig richtige Art und Weise auf die Eigenschaft zuzugreifen ist durch den Getter
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top