Devo allocare esplicitamente il mio numero NSN?
-
03-07-2019 - |
Domanda
Sto definendo un numero, come segue:
NSNumber *nn0 = [NSNumber numberWithInt:0];
Funziona bene senza alcuna allocazione. La mia comprensione è che se uso numberWithInt, alloc e init vengono chiamati automaticamente.
Se provo a rilasciare alla fine della mia funzione, ho dei problemi:
[nn0 release];
Ottengo un errore di runtime.
La mia domanda è: se uso numberWithInt per inizializzare NSNumber, devo fare qualche gestione della memoria su di esso?
Soluzione
I "costruttori di convenienza" poiché molti tipi producono un oggetto che viene automaticamente "rilasciato automaticamente" - vale a dire, il nuovo oggetto verrà mantenuto dall'attuale NSAutoreleasePool. Non è necessario rilasciare manualmente questi oggetti: verranno rilasciati quando viene rilasciato / svuotato l'attuale NSAutoreleasePool.
Vedi questa pagina per una descrizione dei costruttori di convenienza e come gestirne la memoria.
http: // www. macdevcenter.com/pub/a/mac/2001/07/27/cocoa.html?page=3
Altri suggerimenti
Segui semplicemente la regola di gestione della memoria principale: se possiedi " la variabile, alla fine devi abbandonare la proprietà. Assumi la proprietà: creando l'oggetto (allocazione / nuovo / copia) o assumendo la proprietà specifica (conserva). In tutti questi casi, è necessario rilasciarlo.
Se hai bisogno che l'oggetto si attacchi, devi assumerne la proprietà. Quindi, se sai che hai solo bisogno del numero per questo metodo (come passarlo in un array o altro), usa il metodo convenienza e lascialo a quello. Se vuoi mantenere il numero per qualche motivo (e variabile d'istanza, ad esempio), puoi assegnarlo / iniziarlo in sicurezza.
Se rilasci qualcosa che non possiedi, otterrai un errore di runtime.
La regola è semplice, con pochissime eccezioni:
Se il selettore che restituisce un oggetto ha la parola "nuovo", "allocato", "conserva". o " copia " in esso, quindi possiedi l'oggetto restituito e sei responsabile di rilasciarlo al termine.
Altrimenti non lo possiedi e non dovresti rilasciarlo. Se si desidera mantenere un riferimento a un oggetto non di proprietà, è necessario chiamare - [NSObject retain]
su tale istanza. Ora "possiedi" tale istanza deve quindi chiamare - [NSObject release]
sull'istanza quando hai finito. Pertanto non si possiede l'istanza restituita da - [NSNumber numberWithInt:]
e non si deve chiamare -release
al termine. Se si desidera mantenere l'istanza restituita oltre l'ambito corrente (in realtà oltre la durata dell'istanza corrente NSAutoreleasePool
), è necessario -retain
.
In termini di RegEx, Peter Hosey lo espone molto bene nella sua blog . Possiedi l'istanza dell'oggetto restituito se il selettore del metodo corrisponde a questa regex:
/^retain$|^(alloc|new)|[cC]opy/
Naturalmente, il riferimento definitivo è la Guida alla programmazione della gestione della memoria per cacao .