risposta

15

Se l'oggetto foo ha qualche mantiene o copie di (grazie Dave) bar, ad esempio quando si dichiara la proprietà come uno di questi:

@property (nonatomic, retain) NSString *bar; 
// Or 
@property (nonatomic, copy) NSString *bar; 

avrete bisogno di rilasciare bar quando si deallocare foo:

- (void)dealloc 
{ 
    [bar release]; 

    [super dealloc]; 
} 

il sistema non libero bar s' spazio di memoria per voi fino a sbarazzarsi di tutti i riferimenti ad esso (cioè conteggio dei riferimenti scende a 0) in modo, dovrai monitorare i tuoi conteggi e oggetti di riferimento.

+2

+1 devi rilasciare anche se la proprietà è dichiarata come 'copia'. –

2

Se si assegna memoria, è necessario rilasciarlo. Quindi, sì, metti una chiamata a [bar release] o self.bar = nil (se stai usando proprietà sintetizzate e tutto il resto) nel tuo dealloc.

See here per una introduzione alla gestione della memoria su iOS.

+1

'bar = quelle negative non è tagliato, è necessario usare' self.bar = quelle negative o '[auto setBar: nil] 'per rilasciare effettivamente l'oggetto target. Tuttavia, è una cattiva idea chiamare i metodi su 'self' in' -dealloc', quindi chiama '[bar release]'. –

+0

Si spiace che tu abbia ragione, 'self.bar = nil'. I documenti Apple e il codice di esempio spesso 'self.prop = nil' ... Ma per lo più sono d'accordo. – rfunduk

0

L'oggetto A è responsabile del rilascio di qualsiasi riferimento ad altri oggetti (oggetto B, oggetto C, ecc.) Quando viene deallocato, ciò non avviene automaticamente.

Questo viene fatto nel metodo -dealloc sull'oggetto:

- (void)dealloc 
{ 
    [propertyB release]; 
    [propertyC release]; 
    [super dealloc]; 
} 

(o se le proprietà sono di lettura/scrittura e composto come retain, è possibile sostituire [self setPropertyB:nil], ecc).

Quindi, quando tutti i riferimenti all'oggetto A scompaiono, vengono deallocati, riducendo a loro volta il conteggio dei riferimenti sulle proprietà B e C. Se questi oggetti sono di proprietà solo dell'oggetto A, anch'essi finiranno a seguito di una dislocazione.

(Questo è vero per tutti gli sviluppi del sistema operativo iPhone che hai etichettato. Suppongo che tu non stia parlando dell'ambiente garbage-collected sul Mac, che ha regole e comportamenti diversi e fa alcune cose automaticamente.)

0

Il motivo principale per utilizzare self.bar = nil sarebbe se la barra fosse un riferimento a una vista creata in un file di pennino. In tal caso, uno includerebbe quella linea in -(void)viewDidUnload, in quanto ciò consentirà al sistema di rilasciare quell'oggetto quando la vista viene rimescolata. Se la vista ritorna, verrà ricaricata tramite il file pennino. Questo non significa, tuttavia, uno da ovviare la necessità di utilizzare 'self.bar = nil o [bar release] in -(void) dealloc

Problemi correlati