Domanda

Se ho qualcosa come un UILabel collegato a un file xib, devo rilasciarlo su dealloc della mia vista?Il motivo per cui lo chiedo è perché non lo assegno, il che mi fa pensare che non ho nemmeno bisogno di rilasciarlo?ad esempio (nell'intestazione):

IBOutlet UILabel *lblExample;

nell'implementazione:

....
[lblExample setText:@"whatever"];
....

-(void)dealloc{
    [lblExample release];//?????????
}
È stato utile?

Soluzione

Se segui quella che oggi è considerata la migliore pratica, tu Dovrebbe rilasciare le proprietà outlet, perché avresti dovuto mantenerle nella funzione di accesso impostata:

@interface MyController : MySuperclass {
    Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end


@implementation MyController

@synthesize uiElement;

- (void)dealloc {
    [uiElement release];
    [super dealloc];
}
@end

Il vantaggio di questo approccio è che rende esplicita e chiara la semantica della gestione della memoria, e funziona in modo coerente su tutte le piattaforme per tutti i file pennino.

Nota:I seguenti commenti si applicano solo a iOS precedenti alla 3.0.Con la versione 3.0 e successive, dovresti invece semplicemente azzerare i valori delle proprietà in viewDidUnload.

Una considerazione qui, tuttavia, è quando il controller potrebbe eliminare la propria interfaccia utente e ricaricarla dinamicamente su richiesta (ad esempio, se si dispone di un controller di visualizzazione che carica una visualizzazione da un file pennino, ma su richiesta, ad esempio sotto pressione della memoria -- lo rilascia, con l'aspettativa che possa essere ricaricato se la vista è nuovamente necessaria).In questa situazione, vuoi assicurarti che quando la vista principale verrà eliminata, rinuncerai anche alla proprietà di tutti gli altri punti vendita in modo che anch'essi possano essere deallocati.Per UIViewController, puoi gestire questo problema eseguendo l'override setView: come segue:

- (void)setView:(UIView *)newView {
    if (newView == nil) {
        self.uiElement = nil;
    }
    [super setView:aView];
}

Purtroppo questo dà origine ad un ulteriore problema.Poiché UIViewController attualmente implementa il suo file dealloc metodo utilizzando il setView: metodo di accesso (invece di rilasciare semplicemente la variabile direttamente), self.anOutlet = nil verrà chiamato dealloc così come in risposta ad un avviso di memoria...Ciò porterà ad un incidente dealloc.

Il rimedio è garantire che anche le variabili di uscita siano impostate su nil In dealloc:

- (void)dealloc {
    // release outlets and set variables to nil
    [anOutlet release], anOutlet = nil;
    [super dealloc];
}

Altri suggerimenti

Ho trovato quello che cercavo nei documenti Apple.In breve puoi impostare i tuoi oggetti come proprietà che rilasci e mantieni (o semplicemente @property, @synthesize), ma non è necessario per cose come UILabels:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/chapter_3_section_4.html#//apple_ref/doc/uid/10000051i-CH4-SW18

IL

[anOutlet release], anOutlet = nil;

La parte è completamente superflua se hai scritto setView:correttamente.

Se non lo rilasci su dealloc aumenterà l'impronta di memoria.

Vedi maggiori dettagli qui con il grafico ObjectAlloc dello strumento

In un certo senso, assegni l'etichetta creandola in IB.

Ciò che fa IB è osservare i tuoi IBOutlet e come sono definiti.Se hai una variabile di classe a cui IB deve assegnare un riferimento a qualche oggetto, IB invierà per te un messaggio di conservazione a quell'oggetto.

Se utilizzi le proprietà, IB utilizzerà la proprietà di cui devi impostare il valore e non conserverà esplicitamente il valore.Pertanto normalmente contrassegneresti le proprietà IBOutlet come keep:

@property (nonatomic, retain) UILabel *lblExample;

Pertanto in caso etere (utilizzando le proprietà o meno) dovresti chiamare release nel tuo dealloc.

Non è necessario rilasciare qualsiasi IBOutlet che sia una visualizzazione secondaria della visualizzazione principale del tuo Nib, poiché verrà inviato il messaggio di rilascio automatico al momento della creazione dell'oggetto.Gli unici IBOutlet che devi rilasciare nel tuo dealloc sono oggetti di livello superiore come controller o altri NSObject.Tutto questo è menzionato nel documento Apple collegato sopra.

Se non imposti IBOutlet come proprietà ma semplicemente come variabile di istanza, devi comunque rilasciarlo.Questo perché al momento di initWithNib, la memoria verrà allocata per tutti gli IBOutlet.Quindi questo è uno dei casi speciali che devi rilasciare anche se non hai conservato o allocato alcuna memoria nel codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top