2012-06-21 12 views
5

Ho una breve domanda su ARC in iOS. (Scusate, ho chiesto così tanti di questi tipi di domande, ma sono solo molto confuso riguardo alla gestione della memoria.). È importante notare che non ho mai usato il vecchio sistema di manutenzione della memoria (retain, release, assign ecc.), Quindi non so davvero cosa significano questi termini.Quando vengono rilasciate proprietà forti in ARC in iOS?

In questo momento sono confuso riguardo a quello che devo fare per assicurarmi che le proprietà forti vengano rilasciate correttamente. Ad esempio, supponiamo che io crei un'app per la scuola e che l'oggetto School contenga forti riferimenti di proprietà a 5 diversi oggetti Child (non in una matrice). Ogni oggetto Child ha un puntatore forte (proprietà) su un oggetto Book.

Se rimuovo uno degli oggetti Child dalla mia scuola (diciamo facendo la sua proprietà = nil, o cambiando la mia proprietà in modo che punti a un nuovo oggetto), il suo Book sarà correttamente rilasciato? Cosa devo fare per assicurarmi che sia così? Devo scrivere self.myBook = nil in un metodo dealloc? Cosa fare se Child era un controller di visualizzazione, dovrei scrivere self.myBook = nil nel metodo viewDidUnload?

Ho scelto come target solo iOS 5 (e versioni successive), quindi il vecchio modo di gestione della memoria non mi importa.

+0

Ti suggerisco di leggere questo: http://clang.llvm.org/docs/AutomaticReferenceCounting.html –

+0

Grazie per il suggerimento. Darei un'occhiata a questo. – Nosrettap

risposta

5

Se rimuovo una delle Child oggetti dalla mia scuola (ad esempio rendendo la sua property = nil, o cambiando la mia proprietà per puntare a un nuovo oggetto), sarà la sua Book uscirà correttamente?

Sì, sarà rilasciato fino a quando non ci sono altri riferimenti forti ad esso.

Cosa devo fare per assicurarmi che sia così?

Niente di particolare: ARC diminuirà conteggio riferimento dell'oggetto quando si imposta il riferimento a tale oggetto a nil, vedere che l'oggetto non è più viene fatto riferimento, e procedere ad eliminarlo. È abbastanza intelligente da gestire gli oggetti referenziati dall'oggetto che viene eliminato, in modo ricorsivo, in modo da non perdere memoria.

Una cosa che si deve preoccupare è riferimenti circolari: se il vostro Book ha una forte back-riferimento a Child, o fare quel riferimento weak, o trasparente fuori allo stesso tempo, come è possibile impostare manualmente il vostro riferimento del Book-nil (la seconda opzione è soggetta a errori, pertanto non è consigliata).

+0

Diresti che, per la maggior parte, l'unica volta in cui utilizzare "proprietà deboli" è per le prese e per evitare le dipendenze circolari? – Nosrettap

+0

@Nosrettap Evitando i riferimenti circolari e in una certa misura, la memorizzazione nella cache, sono i due "casi-ombrello" che coprono l'uso di proprietà deboli. Un caso speciale importante che vale la pena menzionare separatamente è proprietà che rappresentano i delegati: con la notevole eccezione di 'CAAnimation', tutte le proprietà delegate sono deboli per evitare di creare cicli di conservazione. – dasblinkenlight

+0

Se c'è un ciclo di riferimento, non può "cancellarlo in -dealloc", perché dealloc non verrà mai chiamato! (A meno che non si tratti del dealloc di un metodo che possiede entrambi i membri del ciclo) –

Problemi correlati