2009-08-27 9 views
11
for(UIView *subview in [scrollView subviews]) { 
    NSLog(@"subviews Count=%d",[[scrollView subviews]count]); 
    //[subview release]; 
    [subview removeFromSuperview]; 
} 

in dem obigen Verfahren, wenn ich [subview removeFromSuperview]; verwende es funktioniert gut ... aber wenn ich verwenden [subview release]; Es crashes..i dass wissen wollen, ob beide gleich oder gibt es einen Unterschied zwischen ihnen?entfernt remorsfromsuperview die Objekte von scrollview?

Antwort

29

@MathieuK ist richtig, aber es lohnt sich, tiefer in dieses Thema einzutauchen, denn es ist ein sehr wichtiges Konzept in ObjC. Sie sollten niemals -release für ein Objekt aufrufen, das Sie nicht explizit oder implizit (durch Aufruf eines der Three Magic Words) -retain aufgerufen haben. Sie rufen -release nicht auf, um ein Objekt aufzuheben. Du rufst es an, um den Hold zu lösen, den du auf das Objekt gelegt hast. Ob scrollview seine Subviews behält, ist nicht Ihre Sache (es behält seine Subviews, aber es ist immer noch nicht Ihr Geschäft). Ob -removeFromSuperview Anrufe -release ist auch nicht Ihre Angelegenheit. Das ist zwischen dem Scrollview und seinen Unteransichten. Alles, was zählt, ist, dass Sie Objekte behalten, wenn Sie sich um sie kümmern, und lassen Sie sie los, wenn Sie aufhören, sich um sie zu kümmern, und lassen Sie den Rest des Systems sorgen für das Zurückhalten und Freigeben, was it kümmert.

10

Die Retain-Anzahl Ihrer Subviews ist wahrscheinlich 1. Wenn Sie [subview release]; aufrufen, wird die Retain-Anzahl 0 und die Subview wird aus dem Speicher freigegeben. Der nachfolgende Zugriff auf die Unteransicht (um removeFromSuperview aufzurufen) stürzt ab, weil die Unteransicht nicht mehr vorhanden ist.

In diesem Fall sollten Sie einfach [subview removeFromSuperview] anrufen, weil removeFromSuperviewrelease auf Subview selbst aufrufen wird.

1

Sie müssen die Cocoa Memory Management überarbeiten.

Sie geben einfach keine Dinge frei, die Sie nicht explizit zugewiesen oder beibehalten haben.

-3

Nein, sie nicht gleich sind, wenn Sie die

geprüft

retainCount

nach

removeFromSuperView

Sie, dass nichts sehen geändert wird, so können Sie die gleiche Ansicht wieder mit Witz hinzufügen hout Zuteilung !!

plus Sie sollten niemals ein Objekt freigeben, das Sie nie zugewiesen haben !!

+0

Verwenden Sie nie remateCount. http://stackoverflow.com/a/4636477/19329 – pablasso