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

nel metodo di cui sopra se io uso [subview removeFromSuperview]; funziona bene ... ma se io uso [subview release]; E crashes..i vuole sapere che, se entrambi sono uguali o c'è qualche differenza tra loro?fa removefromsuperview rilascia gli oggetti di scrollview?

risposta

29

@ MathieuK è corretto, ma vale la pena scavare più in profondità in questo, perché è un concetto molto importante in ObjC. Non chiamare mai -release su un oggetto che non hai -retain in modo esplicito o implicito (chiamando uno degli Three Magic Words). Non chiami -release per deallocare un oggetto. Si chiama per rilasciare la stiva si hanno messo l'oggetto. Se scrollview conserva le sue sottoview non è il tuo business (mantiene i suoi sottoview, ma non è ancora il tuo business). Se lo -removeFromSuperview chiama lo -release non è nemmeno il tuo caso. Questo è tra la scrollview e le sue sottoview. Tutto ciò che conta è che tu mantenga gli oggetti quando ti interessi di loro e li rilasci quando smetti di prenderti cura di loro, e lascia che il resto del sistema si occupi di conservare e rilasciare ciò che interessa allo.

10

Il numero di ritenzione delle proprie sottoview è probabilmente 1. Quando si chiama [subview release]; il conteggio di conservazione diventa 0 e la visualizzazione secondaria viene rilasciata dalla memoria. L'accesso successivo alla sottoview (per chiamare removeFromSuperview) si interrompe perché la sottoview non c'è più.

In questo caso, è sufficiente chiamare lo [subview removeFromSuperview] perché removeFromSuperview chiamerà release nella visualizzazione secondaria stessa.

1

È necessario modificare lo Cocoa Memory Management.

Semplicemente non rilasciare elementi che non sono stati assegnati o mantenuti esplicitamente.

-3

No, non sono la stessa cosa, se è stata selezionata la

retainCount

dopo

removeFromSuperView

vedrete che nulla è cambiato, quindi puoi aggiungere di nuovo la stessa vista hout allocandolo !!

in più non dovresti mai rilasciare un oggetto che non hai mai assegnato !!

+0

Non utilizzare mai retainCount. http://stackoverflow.com/a/4636477/19329 – pablasso

Problemi correlati