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?

È stato utile?

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];
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top