2009-07-10 10 views
1

Ich versuche, eine neue Ansicht in einen vorhandenen Ansichtscontroller zu laden, aber ich möchte diese Ansicht aus einer XIB-Datei laden. Mein Plan war, einen zweiten viewController zu erstellen (viewController1 im folgenden Code), dann behalten Sie seine Ansicht bei und geben den von mir erstellten viewController frei. Ich hatte gehofft, dass der ViewController freigegeben würde und die Ansicht bleiben würde, aber das scheint nicht zu passieren.Kann ich eine View behalten und gleichzeitig den ViewController freigeben?

Frage 1: Wenn ein Viewcontroller dealloced wird, wird die zugehörige View dealloced, unabhängig davon, wie die Anzahl der Views ist. In meinem Beispielcode unten können Sie sehen, dass die Ansicht eine Retain-Anzahl von 13 hat, bevor es plötzlich einfach verschwindet.

Frage 2: Warum erhöht das Beibehalten der Ansicht ihren retainCount um 3?

PageViewController *viewController1 = [[PageViewController alloc] initWithNibName:@"Page1" bundle:nil]; 
[viewController1.view setUserInteractionEnabled:YES]; 

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1 
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=4 

self.currentPageView=viewController1.view; 

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1 
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=7 


[viewController1.view retain]; 

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1 
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=10 

[self.view addSubview:viewController1.view]; 

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1 
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=13 

[viewController1 release]; 

NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); 
//objc[3237]: FREED(id): message view sent to freed object=0x538ce0 

Antwort

1

Der Fehler Sie über die „Nachricht an befreite Objekt gesendet“ getting sagt Ihnen nicht, dass die Ansicht freigegeben wurde, ist es, dass viewController1 befreit wurde, und so bist du ein immer Fehler, wenn Sie die "Ansicht" Nachricht senden. (Denken Sie daran, dass in Objectiv C jeder Immobilienzugriff wirklich eine Nachricht sendet ...)

Ich bin mir nicht sicher, warum die Zählung der Ansicht jedes Mal um 3 springt.

+0

Danke, ich habe immer noch nicht herausgefunden, warum die Retain-Zählung jedes Mal um 3 springt, aber ich denke, das ist chaotisch genug, dass ich nur versuchen werde, Dinge zu refactorieren, um das Problem vollständig zu vermeiden. Ich wünschte, ich hätte genug Reputation, um die Antwort von Hikaru zu bestätigen, auch das war hilfreich. – niels

1

helfen Dies könnte:

[[NSBundle mainBundle] loadNibNamed:@"Page1" owner:self options:nil]; 

wo selbst die bestehenden Viewcontroller ist.

1

diese Linie ist sinnlos

self.currentPageView=viewController1.view;

Der Blick in viewController1 ist noch nicht gebaut, weil die Methode Loadview in diesem Controller nicht

genannt wird

obwohl Sie neue subview in die viewController.view hinzufügen aufgrund von "magic" können Sie ein Objekt zu einer Ansicht hinzufügen, die noch nicht erstellt wurde.

Es ändert sich nicht die Tatsache - die viewController.view existiert zu diesem Zeitpunkt nicht.

Hinweis: Alle controller.view in viewDidLoad/Loadview-Methode aufgebaut ist, und viewDidLoad/Loadview nicht aufrufen, bis es angezeigt geht (. ZB pushController)

in der Regel i verlassen sich nicht auf Zähler behalten, weil es ist nicht zuverlässig.

Verwandte Themen