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?

È stato utile?

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 .

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