2009-03-17 14 views
0

Ich habe ein UIScrollView, das mehrere Seiten mit Informationen enthält, die dem ScrollView als Unterviews hinzugefügt werden. Der Controller jeder Unteransicht ist in einem NSMutableArray in scrollViewController gespeichert.Subviews freigeben

Ich habe einige Speicherlecks in den Unteransichten, und ich versuche, sie zu beheben, indem Sie sicherstellen, dass Dealloc-Methode jedes Subview-Controller aufgerufen wird. Ich mache das, indem ich die View-Controller aus der Dealloc-Methode des scrollView-Controllers freigebe.

Wenn ich versuche, das Array freizugeben, nachdem die SubViews-Controller freigegeben wurden, stürzt die Anwendung ab.

Code folgt ... Was mache ich falsch?

- (void)dealloc { 

// Loop through the array of subView controllers and release them 
for (int i = 0; i < [viewControllers count]; i ++) { 
    [[viewControllers objectAtIndex:i] release]; 
} 

[viewControllers release]; // Crashes here unless I remove the loop above 
[scrollView release]; 
[pageControl release]; 
[theKnot release]; 
[super dealloc]; 

}

Antwort

4

NSMutableArray nimmt den Besitz der darin enthaltenen Objekte - sie ihre Referenzzähler erhöht, wenn hinzugefügt, und wird seine Objekte freigeben, wenn sie sich freigibt.

Angenommen, Sie haben jeden View-Controller freigegeben oder freigegeben, nachdem Sie ihn in Ihr Array viewControllers gelegt haben. Sie müssen keine Schleife über Objekte in viewControllers einfügen und sie freigeben - das Array erledigt dies für Sie.

Sie stürzen ab, wenn Sie das Array freigeben, da das Array versucht, Objekte freizugeben, die Sie bereits freigegeben haben und die nun ungültig sind.

1

NSArray gibt seinen Inhalt frei, wenn er freigegeben wird. Die Objekte werden also sowohl in der Schleife - die sie wahrscheinlich aufheben soll - als auch danach vom Array freigegeben.

Sie sollten Apples memory management guide lesen, wenn Sie planen, iPhone Apps zu erstellen. Es ist nicht so schwer, aber es ist etwas, was du lernen musst. Sonst werden Sie Lecks und Abstürze bekommen und keine Ahnung warum. Sobald Sie die wenigen einfachen Regeln von Cocoa verstehen, wird alles klar sein.