2008-10-30 7 views
6

Also ja, ich bin ein Java-Typ in dieser verrückten iPhone-Welt. Wenn es um die Speicherverwaltung geht, habe ich keine Ahnung davon, was ich mache.Wie kann ich den UIViewControllers mit einem Navigationscontroller verwalten?

Ich habe eine App, die einen Navigation-Controller verwendet, und wenn es Zeit ist, zur nächsten Ansicht zu gehen auf I-Code, der wie folgt aussieht: auf Speicherverwaltung

UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView" 
                    bundle:[NSBundle mainBundle]; 
[[self navigationController] pushViewController:myController animated:YES]; 

nun nach Apples Grundregel

Sie nehmen Besitz eines Objekts, wenn Sie es mit einer Methode, deren Name mit „alloc“ oder „neu“ oder enthält „Kopie“ (zum Beispiel alloc, newObject oder mutableCopy) erstellen, oder wenn Sie senden es ist ein retain Nachricht. Sie sind dafür verantwortlich, das Eigentum an Objekten, die Sie besitzen, mit release oder autorelease abzugeben. Jedes andere Mal, wenn Sie ein Objekt erhalten, dürfen Sie es nicht freigeben.

mir, dass bedeutet, dass ich myController Freigabe werden soll, oder es eine autorelease Botschaft. Aber wenn ich das versuche, stürzt meine Anwendung ab, während ich die Ansichten vom Stapel verschiebe.

Das hat nicht richtig zu mir gerochen, aber in laufenden Geräten behauptet es, dass ich keine Speicherlecks habe.

Also ich meine Frage ist

  1. Bin ich dieses Recht zu tun?
  2. Bekommt der Navigationscontroller Besitz von MyViewController und erklärt das Fehlen eines Speicherlecks?
  3. Sollte ich myController einer Instanzvariable in meinem root ViewController zuweisen? In diesem Fall wäre es behalten werden markiert, und ich würde Freisetzung im dealloc Methode der Wurzel

Antwort

3

@Ben Gottlieb warum brauchen Sie eine automatische Freigabe, bevor Sie es drücken? Zahl bei Objektzuordnung behalten 1, Autofreigabe vor oder nach dem Drücken der Zählung beibehalten hat keinen Einfluss, wenn auch als eine Frage des Stils allgemein autoreleasing afer Objekt alloc/init angewandt wird:

[[[object alloc] init] autorelease]; 

@bpapa,

2) Beim Drücken behält der Navigationscontroller den View-Controller. Wenn diese Ansicht später aus dem Navigationssteuerungs-Stack herausgesprungen ist, wird sie vom Navigations-Controller freigegeben.

3) Sofern es keinen ausdrücklichen Grund gibt, diese Ansicht zu behalten, sollten Sie sie keiner Instanzvariablen zuweisen. Im Allgemeinen möchten Sie, dass Ihre Ansichten nur so lange existieren, wie Sie sie benötigen.

+0

Ich habe nur die Verwendung von Autorelease mit Release kontrastiert. Sie können die Autorelease vor oder nach der Autorisierung durchführen, aber wenn Sie sie freigeben, MÜSSEN Sie dies nachher tun. –

9

Das Problem ist (wahrscheinlich) Sie die Freigabe Ihre Viewcontroller vor hat die Navigation Controller eine Chance, Eigentum zu beanspruchen. Es gibt zwei Möglichkeiten, um diesen:

  • -release den Controller nach es dem Nav-Controller
  • -autorelease Ihres Controller vor schieben schiebt es. Wenn Sie dies tun, wird der aktive NSAutoreleasePool (über den Sie sich keine Sorgen machen müssen) darauf achten, Ihren Controller zu einem späteren Zeitpunkt freizugeben.