Perdita di memoria trovato con clangore ma la liberatoria sopraelevazione e crash autorelease
-
20-09-2019 - |
Domanda
Ho una classe che costruisce una richiesta sulla base di alcuni passato nelle variabili. La classe ha anche tutti i metodi delegato per ricevere i dati e lo memorizza in una proprietà per la classe chiamata per recuperare.
Quando la classe inizializza crea una connessione e poi si ritorna:
NSURLConnection *connection;
if (self = [super init]) {
self.delegate = theDelegate;
...some code here...
connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];
}
return self;
Quindi non riesco a rilasciarlo normalmente e se io AutoRelease si blocca. E 'il lavoro della classe chiamata a rilasciare? E se è così si limita a rilasciare l'oggetto initilised anche rilasciare connessione o avete di rilasciare in modo specifico? Se sì, come sarebbe?
Grazie
Soluzione
Fai connection
una variabile di istanza e rilasciarlo su richiesta. La domanda "chi" dovrebbe rilasciare l'oggetto dipende strettamente tuoi semantica degli oggetti e la gerarchia.
Altri suggerimenti
Perché si sta aprendo un NSURLConnection
all'interno di un costruttore?
In genere, il costruttore non deve svolgere questo tipo di lavoro. Se la connessione è associato all'oggetto, vorrei fare connection
una proprietà dell'oggetto e [connection release];
all'interno del metodo dealloc
dell'oggetto.
Ricordate che non si deve mettere tutta la vostra fede in Clang. Esso può e deve segnalare falsi negativi e falsi positivi.
Clang sta migliorando ogni giorno, ma è ancora nella sua infanzia in questo momento. E 'fantastico che è integrato con Xcode così bene, ma basta tenere a mente che ha alcuni difetti.
In questo caso, dipende dalla portata della variabile si sta memorizzare l'oggetto di connessione. Se viene dichiarata come una variabile di istanza, allora dovrebbe essere ok, a patto che si rilascia in dealloc o in qualche altro punto in cui il gioco è fatto con esso.
Se, come hai postato nella sua interrogazione, la dichiarazione di connection
è locale al metodo init, poi Clang è correttamente segnalando una perdita. Si dovrebbe fare connection
una variabile di istanza o una proprietà e garantire lo si rilascia in dealloc o quando hai finito con esso.