NSDate init domanda, relativa alla gestione della memoria in Objective-C
-
11-09-2019 - |
Domanda
Ho un oggetto NSDate
creato da
NSDate *date = [[NSDate alloc] init];
Più tardi, voglio reimpostare la data per l ' "adesso", così ho pensato che
[date init];
o
date = [date init];
potrebbe fare il lavoro, ma non lo fanno. Invece,
[date release];
date = [[NSDate alloc] init];
funziona. Sono un po 'confuso su questo, dal momento che nella documentazione per - (id) init
, che dice:
restituisce un oggetto NSDate inizializzato per la data e l'ora corrente.
e dal momento date
è già assegnato, non dovrebbe solo bisogno di un messaggio di init
?
Soluzione
Si pensi alloc
e init
metà logicamente inseparabili di un costruttore. Si può solo chiamare i metodi che iniziano con "init" una volta su un determinato oggetto - una volta che l'oggetto è stato inizializzato, ed è un errore per inizializzare di nuovo. Questo è vero per qualsiasi oggetto Objective-C, non solo NSDate. Tuttavia, gli oggetti NSDate sono anche immutabile -. Una volta creati, non possono cambiare
Il motivo quest'ultimo codice funziona è perché si sta creando una nuova istanza di NSDate, che è la cosa giusta da fare. È inoltre possibile utilizzare [data NSDate] per ottenere la stessa cosa. Essere consapevoli che restituisce un oggetto che non si fa (ancora) proprio, quindi avrai bisogno di mantenere se avete bisogno di tenerlo in giro, e rilasciarlo in seguito.
Si noti che se si riceve un oggetto da parte di qualcuno, è già stato inizializzato. (In caso contrario, si tratta di un errore di programmazione nel codice che ha fornito, o è un'eccezione estremamente rara alla regola.)
Altri suggerimenti
Se si desidera ottenere la data corrente si può semplicemente utilizzare:
NSDate * now = [NSDate date];
Se si desidera mantenere poi retain
esso.
NSDate * now = [[NSDate date] retain];
Non si può ripristinare NSDate
con init, init è solo per l'inizializzazione l'oggetto per la prima volta.
Si può solo ottenere un'altra data:
NSDate * now = [[NSDate date] retain];
// use the now object
// need new date
[release now];
now = [[NSDate date] retain];
// once you don't need it release it
[now release];
Il messaggio date
ritorna esempio autoreleased
di NSDate
, da cui il release
o autorelease
.
Il autorelease
è utilizzato per i casi in cui non si vuole preoccupare di dove esattamente è necessario rilasciare l'oggetto - è messo in autorelease pool
. Oggetto in piscina autorelease vengono rilasciati dopo la fine della manifestazione iterazione del ciclo, oppure quando si chiama rilascio sulla piscina ... (vedi più nel documentazione di Apple circa la gestione della memoria).
Btw. il [NSDate date]
è un metodo comodo è probabilmente qualcosa di simile (non quaranteed essere esattamente lo stesso, ma funzionalmente simile a):
- (NSDate *)date
{
return [[[NSDate alloc] init] autorelease];
}