2009-05-21 14 views
5

Im abbastanza nuovo per la programmazione e il rilascio degli oggetti in modalità obiettivo è il mio più grande mal di testa. Sono sempre in dubbio su cosa debba essere rilasciato, e i miei tempi ho finito col rilasciare la variabile sbagliata e ottenere un crash BAD EXEC. Ho letto la guida di Apple sulla gestione della memoria, ma non posso sempre passare dai loro esempi al mio codice.Rilascio oggettivo-C di singleton

Una di queste situazioni è il mio singleton (sono un grande Singleton).

ne ho uno definiscono come questo:

static Configuration* _instance; 

+(Configuration*)getInstance{ 
    if (_instance == NULL){ 
     _instance = [Configuration alloc]; 
     [_instance initConfig]; 
    } 
    return _instance; 
} 

Nel mio codice lo uso così:

//Store configuration  
Configuration* conf = [Configuration getInstance]; 
conf.userName = self.userName.text; 
conf.cellPhone = self.phoneNumber.text; 

ho bisogno di liberare la variabile "conf"?

Quando devo rilasciare la _instance?

Dal momento che sto eseguendo questo codice su iPhone, cosa succede con i vars non rilasciati? influenzeranno le prestazioni dell'iPhone?

risposta

8

Quando si è creata l'istanza di configurazione con "_instance = [allocazione di configurazione]; [_instance initConfig];" aveva un conteggio di mantenimento di uno dalla chiamata alloc. Se dovessi rilasciare conf dopo "conf.cellPhone = self.phoneNumber.text;" allora sarebbe stato deallocato a quel punto.

Quando si crea per la prima volta un oggetto con alloc, o copia o mutableCopy, il numero di conservazioni sarà pari a 1. Ciascuna chiamata a mantenere aumenta di un conteggio. Ogni chiamata al rilascio diminuisce che mantiene il conto di 1. Chiamare autorelease significa semplicemente "Rilasciare le chiamate per me più tardi", quindi se le conferme e le release sono come assegni, autorelease è come un appuntamento con un assegno futuro.

Il codice che accede al singleton di configurazione non lo conserva, non lo copia o copiabile, quindi non deve rilasciarlo.

Come il codice è stato scritto ora, l'oggetto Configuration non verrà mai rilasciato e vivrà per l'intera durata della vita delle applicazioni, che in genere è ciò che si desidera con un singleton.

+0

potresti dare un'occhiata a questo, immagino che tu possa aiutarmi http://stackoverflow.com/questions/6928028/objective-c-alloc-release-error-in-singleton-class – Spring

2

Non è necessario rilasciare la variabile conf poiché non è stata mantenuta.

Come regola generale, è necessario bilanciare le chiamate a metodi che incrementano un conteggio di ritenzione con metodi che diminuiscono.

init, retain, incrementarlo, mentre release lo decrementa.

La _instance principale viene rilasciata quando la classe viene scaricata, quindi penso che non sia necessario preoccuparsene.