2012-08-24 10 views
6

Sono nuovo nello sviluppo di iphone. Sto usando ARC per il mio progetto. Per quanto ho capito usando ARC non è necessario rilasciare alcun oggetto manualmente. Ma, ho osservato in alcuni punti, le persone impostano esplicitamente il loro oggetto a zero nel ViewDidUnload anche dopo aver usato ARC.Proprietà deboli e forti in -viewDidUnload in ARC

Ad esempio, nel file h ho qualcosa di simile a questo:

@property (unsafe_unretained, nonatomic) IBOutlet MKMapView *mapViewOutlet; 
@property (unsafe_unretained, nonatomic) IBOutlet UIToolbar *toolBar; 
@property (strong,nonatomic) NSMutableArray *dataArray; 

E .m come segue:

- (void)viewDidUnload 
{ 
    [self setMapViewOutlet:nil]; 
    [self setToolBar:nil]; 
    [super viewDidUnload]; 
    self.dataArray=nil; 
} 

La mia domanda è, è davvero necessario specificare esplicitamente zero nel ViewDidUnload anche sotto ARC?

risposta

10

L'intero punto del metodo viewDidUnload consiste nel rilasciare i dati che non sono realmente necessari per liberare memoria. the documentation Leggi:

Quando si verifica una condizione di memoria e vista la corrente del controller della vista non sono necessari, il sistema può scegliere di rimuovere quelle viste da memoria. Questo metodo viene chiamato dopo che la vista del controller della vista è stata rilasciata ed è la tua possibilità di eseguire qualsiasi pulizia finale. Se il proprio controller di visualizzazione memorizza riferimenti separati alla vista o le sue sottoview , è necessario utilizzare questo metodo per rilasciare tali riferimenti. È inoltre possibile utilizzare questo metodo per rimuovere riferimenti a qualsiasi oggetto creato dall'utente per supportare la vista, ma che non è più necessario ora che la vista non è più disponibile. Non utilizzare questo metodo per rilasciare i dati utente o altre informazioni che non possono essere facilmente ricreate.

così si sta impostando le proprietà a nil al fine di rilasciare gli oggetti ora e aiutare il sistema per liberare un po 'di memoria. Ma ovviamente questo dipende dal tipo di proprietà - le proprietà forti sono "tue" e solo tu puoi decidere se rilasciarle ora (impostando su nil) o no. Le proprietà deboli potrebbero essere già nil, ad esempio se hanno indicato alcune viste rilasciate con la vista principale. E le proprietà unsafe_unretained sono una bestia speciale. L'oggetto a cui punta potrebbe essere già stato rilasciato, ma ciò non significa che siano stati impostati automaticamente su nil. Dovresti quindi utilizzare uno dei tipi di proprietà "più sicuri" (forte/debole) o impostare le proprietà non sicure su nil qui, per assicurarti di non utilizzare l'oggetto rilasciato in un secondo momento. Non ci sono regole rigide in questo caso, devi pensare alla situazione e cosa significa per le varie proprietà.

A proposito, viewDidUnload diventa obsoleto in iOS 6, in cui nessuna vista viene rilasciata in condizioni di memoria insufficiente. Continuerai a ricevere il callback didReceiveMemoryWarning, in modo che tu possa rilasciare alcune risorse lì se lo desideri. Di nuovo, ti suggerisco di leggere la documentazione ed eseguire alcuni test per vedere cosa succede e decidere cosa dovresti fare.

+0

Ma, anche se non impostato su zero, il sistema libererà automaticamente la memoria in ARC, giusto? – Raj

+0

Alla fine, sì. È difficile (er) creare una perdita sotto ARC. Spetta a te decidere se puoi aiutare il sistema liberando alcuni grossi pezzi di memoria quando la tua app riceve l'avviso di memoria. – zoul

+0

Ok. Accetterò questa risposta – Raj

2

Quando si utilizza unsafe_unretained, si dovrebbe assegnare a zero perché non verrà assegnato a zero in modo implicito, in cui è caso di riferimento debole sarà assegnato a zero in modo implicito. Quindi per evitare qualsiasi riferimento ciondolante è necessario assegnare a zero in caso di unssafe_unretained.

+0

Anche io ho pensato la stessa cosa. Ma ho visto in alcuni punti anche i riferimenti deboli impostati su zero. Nella mia domanda è possibile vedere anche il riferimento forte impostato su zero. – Raj

3

ARC rilascia solo le proprietà che non contengono un riferimento forte a un oggetto. Nel tuo caso, questi sono tutti riferimenti forti, quindi saranno conservati a meno che non siano esplicitamente impostati a zero.

Il metodo viewDidUnload non significa che il tuo UIViewController viene rimosso dalla memoria, significa semplicemente che le sue viste vengono rimosse dalla memoria (iOS Developer - ViewController lifecycle).

In questo caso, il tuo UIViewController rimane in memoria, e quindi anche le sue proprietà, a meno che non siano esplicitamente impostate su zero.

+0

Nel mio caso, non sono tutti riferimenti forti. Per le tue informazioni, debole non è supportato in IOS4, ma usiamo non sicuro, che a volte può creare dei puntatori penzolanti. Le funzionalità sono entrambe uguali – Raj

+0

Corretto, spiacente stavo cercando la parola chiave debole (ora in via di sviluppo solo per iOS5). – Resh32

+0

e per quanto ne so ARC chiamerà automaticamente dealloc per i forti riferimenti. Quindi non dobbiamo impostarli nil esplicitamente. Dove per i riferimenti deboli lo stiamo impostando a zero, per evitare puntatori penzolanti che può essere possibile in alcuni casi – Raj

Problemi correlati