2010-06-24 4 views
5

Ich laufe immer wieder in Situationen mit UIViewControllern, die eine große Menge an IBOutlets enthalten, die den Controller mit den Unteransichten seiner Ansicht verbinden (normalerweise UILabels).Wirklich bewährte Methode, IBOutlet-Ansichtselemente beizubehalten?

Nach "Best Practices", das heißt auf allen UI-Elemente behalten: @property (retain, nonatomic) UILabel *theElement1, @property (retain, nonatomic) UILabel *theElement2, ... gibt mir wahnsinnige Mengen von Kesselblech Code in dealloc und viewDidUnload für den View-Controller.

Die angreifenden IBOutlets werden niemals außerhalb des UIViewControllers verwendet oder gesetzt (die set-Methode wird nur in viewDidUnload verwendet und wenn die nib geladen wird) außer automatisch, wenn die nib geladen wird.

Das Ergebnis von "best practice" ist:

  • dealloc mit [theElement1 release] übersät, [theElement2 release] usw.
  • viewDidUnload mit [self setTheElement1:nil], [self setTheElement2:nil] usw.

Da jedoch alle diese Elemente sind bekannt, dass durch die Ansicht sowieso beibehalten werden, und die Ansicht wird von der UIViewController zu geeigneten Zeiten freigegeben, ich sehe absolut keinen Grund überhaupt für mich, dies manuell zu verwalten.

Der Grund für diese besondere "Best Practice" (soweit ich das beurteilen kann) besteht darin, dass Sie mit Ihren Daten übereinstimmen. Aber sobald Sie beginnen, eine große Anzahl von Steckdosen zu haben, werden Sie eher die Steckdose irgendwo in einer der beiden Methoden zu behandeln, als Sie Probleme haben, die Steckdosen richtig zu ändern, um für die speziellen Steckdosen zu behalten, die Sie wirklich wollen zu behalten, auch nach der Ansicht ist auf Wiedersehen.

Gibt es einen Grund für diese "best practice", außer der, die ich kenne, oder sollte ich mich ganz frei fühlen, diese "Regel" im speziellen Fall von Subviews auf die Sicht eines UIViewControllers zu brechen?

+0

Ich mag das Thema dieser Frage. "Wirklich" – VoodooChild

Antwort

4

Sie sollten diese Best Practice einhalten. Es schützt Sie vor sehr bizarren Abstürzen, wenn Sie nach einer Speicherwarnung auf IBOutlets zugreifen. Ja, Sie müssen Ihre IBOutlets manuell verwalten. Accessorizer macht eine gute Arbeit, diesen Code zu automatisieren.

Vor ObjC 2.0 mussten wir alle unsere Accessoren auch manuell schreiben (@property und @synthesize sind sehr neue Ergänzungen in der Sprache). Die Dinge sind viel schöner geworden. Wenn wir uns dem 64-Bit-ABI und der Garbage-Collection zuwenden, werden die Dinge noch einfacher (und Sie sollten erwarten, dass diese Dinge schließlich ihren Weg zum iPhone finden).

Befolgen Sie vorerst die Speicherverwaltungsregeln wie in Memory Management of Nib Objects beschrieben. Sie handeln eine sehr kleine Menge an Eingabe für eine große Menge an Debugging. (Hmm, sieht so aus, als hätten sie dieses Dokument wieder aktualisiert; Zeit, um mich selbst zu studieren.)

+0

Schön - ich hatte das Nib Memory Management Dokument noch nicht gesehen. –

+0

Meine einzige vernünftige Alternative ist nach einiger Zeit das Erzeugen von UI-Elementen per Hand und das Einkleben in ein NSArray. Aber das ist wie eine Flagge winken und aufgeben. Etwas wie 20-30 IBOutlets ist ein Wartungs-Albtraum. Und warum sollte ich so viele Verkaufsstellen haben, die Sie fragen könnten? Lokalisierte UILabels ist meine Antwort. – Nuoji

+0

Abgesehen davon, dass es schwieriger ist, Fehler in diesen Bereichen zu debuggen, was sind die Nachteile? In der Tat könnten Sie für diese speziellen Felder auf die gesamte @ Eigenschaft/@ synthetisieren verzichten und diese Felder @private machen, um zu verhindern, dass andere Klassen fälschlicherweise glauben, dass sie auch verwendet werden können, wenn die Ansicht gelöscht wurde. Ich spreche im sehr spezifischen Kontext von UIViewControllers und (schreibgeschützt) Teilansichten zu der Ansicht dieses Controllers. Das Problem mit einer großen Menge von IBOutlets scheint in anderen nicht besonders wahrscheinlich zu sein. – Nuoji

Verwandte Themen