2012-10-09 13 views
9

Non ho mai lavorato a progetti basati su ARC. Ho appena incontrato uno zombie nel mio progetto basato su ARC. Ho scoperto che era a causa del ciclo di conservazione. Mi chiedo solo che cos'è un ciclo di conservazione. PuòConservare il ciclo in ARC

Potrebbe fornirmi un esempio per il ciclo di conservazione?

+4

Uno zombie non si verifica a causa di un ciclo conservare. – bbum

risposta

22

Un mantenere ciclo è una situazione in cui oggetto A conserva oggetto B, e oggetto B conserva l'oggetto A allo stesso tempo *. Ecco un esempio:

@class Child; 
@interface Parent : NSObject { 
    Child *child; // Instance variables are implicitly __strong 
} 
@end 
@interface Child : NSObject { 
    Parent *parent; 
} 
@end 

È possibile correggere un ciclo in ARC mantengono utilizzando __weak variabili o weak proprietà per le vostre "collegamenti di nuovo", cioè i collegamenti per dirigere o genitori indiretti in una gerarchia di oggetti:

@class Child; 
@interface Parent : NSObject { 
    Child *child; 
} 
@end 
@interface Child : NSObject { 
    __weak Parent *parent; 
} 
@end 


* Questa è la forma più primitiva di un ciclo di conservazione; può esserci una lunga catena di oggetti che si mantengono l'un l'altro in un cerchio.

+2

Il ciclo di conservazione causerà una perdita di memoria in ARC? – Raj

+0

@Raj Assolutamente! I cicli di conservazione non sono specifici di ARC, causeranno perdite di memoria in scenari ARC e non ARC. – dasblinkenlight

+0

Potremmo evitare che causino perdite di memoria come ho spiegato nei commenti alla risposta di @ Simon_Germain. – trss

9

Ecco cosa è un ciclo di conservazione: quando 2 oggetti mantengono un riferimento tra loro e vengono mantenuti, crea un ciclo di conservazione poiché entrambi gli oggetti cercano di trattenere l'un l'altro, rendendo impossibile il rilascio.

@class classB; 

@interface classA 

@property (nonatomic, strong) classB *b; 

@end 


@class classA; 

@interface classB 

@property (nonatomic, strong) classA *a; 

@end 

Per evitare mantenere cicli con ARC, dichiarare semplicemente uno di essi con un riferimento weak, così:

@property (nonatomic, weak) classA *a; 
+0

Impossibile da rilasciare? Potrebbe essere rilasciato se stiamo attenti a riassegnare qualche altro oggetto per una di quelle proprietà che rompono la catena giusto? Lo sto chiedendo in particolare perché ho sentito l'impossibile pubblicare molte volte. – trss

+0

L'intestazione "Evitare la regola dei cicli di conservazione n. 4: utilizzare i metodi" chiudi "per interrompere i cicli" all'indirizzo http://www.cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html sembra confermare che è possibile interrompere i cicli di conservazione. È decisamente meglio evitare, ma dove altrimenti crea complessità, potrebbe comunque essere usato, ma con attenzione, per romperlo prima che creino una perdita di memoria, evitando così la perdita. – trss

+0

Impossibile potrebbe essere un po 'esagerato, ma diciamo solo che non è esattamente banale. Niente è impossibile. –

Problemi correlati