2013-07-01 5 views
8

Hanno un problema interessante in cui esiste una classe a cui viene fatto riferimento in un layout XIB (sottoclasse di UIScrollView) e che non viene deselezionata in base a Strumenti/Allocazioni e non si rompe nella sua routine dealloc. Chiamiamolo Sclass1.IOS 6.1 con ARC Class da XIB non ottiene Deallocated, UIClassSwapper

C'è una classe using (chiamiamola Uclass) che ha il file XIB e la presa.

@property (nonatomic, weak) IBOutlet Sclass1* sclass1; 

Questo è collegato correttamente al layout del file XIB.

Sclass1 è una proprietà assegnata quando viene caricato XIB per Uclass. Uclass viene deallocato e quindi ricreato di volta in volta e quindi abbiamo un'altra istanza di Sclass1, ma Sclass1 non va mai via e non riesce a trovare un altro riferimento ad esso.

Scavare in Strumenti mostra quello di Malloc e basta.

Cordiali saluti, la classe viene avviato con

[UIClassSwapper initWithCoder:] 

risposta

0

Credo che la vostra @property dovrebbe essere forte per una classe:

@property (nonatomic, strong) IBOutlet Sclass1* sclass1; 

Perché strong è l'equivalente di retain e ARC gestirà l'immissione in tu.

Avrete maggiori informazioni con la documentazione Apple su Transitioning to ARC Release Notes nella sezione attributi di proprietà.

+0

Questa è la risposta corretta, tutto ciò che è un IBOutlet deve essere debole, la vista non viene rilasciata perché il controller ha un punto di ritenzione per la presa e la presa ha un riferimento al controller. Creare un ciclo di conservazione. Avere un upvote –

5

Se un oggetto non viene deallocato sotto ARC, significa che esiste un forte riferimento ad esso. Dal momento che la proprietà è weak, l'oggetto deve essere di proprietà di qualcosa di diverso dall'oggetto Uclass (altrimenti verrà deallocato immediatamente dopo il caricamento di XIB). Nel codice che ci hai fornito non è chiaro quale sia il forte attuale proprietario di questo oggetto è, ma suppongo che potrebbe essere uno (o più) dei seguenti elementi:

  1. Da classe dell'oggetto è un UIView sottoclasse, può essere (fortemente) referenziato dal suo superview se aggiunto come uno di subviews. Ciò accade automaticamente quando viene caricato un file XIB. Se lo superview non viene deallocato, neanche l'oggetto SClass. È possibile rimuovere questa proprietà chiamando removeFromSuperview
  2. Un forte ciclo di proprietà (ciclo di conservazione) esiste da qualche parte tra i ivars dell'oggetto SClass1 (ovvero una delle variabili di istanza di proprietà elevata ha un forte riferimento al proprietario - lo SClass1) . Fai attenzione che qualsiasi blocco che utilizza self mantiene anche un riferimento sicuro. Avere un forte riferimento al blocco porta spesso a un ciclo di conservazione. Salva self in un __weak var e passa invece al blocco, a meno che tu non abbia una buona ragione per non farlo.
  3. Un riferimento forte creato manualmente esiste ad es. aggiungendo l'oggetto a un contenitore o salvando il puntatore su una variabile non __weak.

Prova a trovare e rimuovere queste forti proprietà. Solo dopo che tutti sono stati rimossi, l'oggetto può essere deallocato.

1

Poiché la tua proprietà è debole e non è ancora stata rilasciata, cerca riferimenti forti a Sclass o al suo proprietario, Uclass. Forse stai usando Uclass (o Sclass) direttamente nel blocco, senza __weak typeof (self) weakSelf dancing e questo blocco crea il ciclo di conservazione. Guarda anche le relazioni e i delegati genitori-figli. Forse c'è un delegato che è forte invece che debole o due controller hanno forti riferimenti a vicenda.

Inoltre, se si desidera avere risposte più dettagliate, si prega di inviare più codice rilevante.

+0

Grazie per aver segnalato il ciclo di conservazione indotto dal blocco. Questo è davvero un caso comune IMO. Aggiunto anche alla mia risposta. – burax

0

Recentemente ho avuto gli stessi sintomi - per risolverlo nel mio caso, il mio oggetto agiva come delegato per una serie di altri oggetti, quindi abbiamo dovuto rilasciare l'oggetto da tutte le sue responsabilità delegato prima che avrebbe chiamato dealloc

Problemi correlati