Frage

Ich habe ein NSDate Objekt erstellt von

NSDate *date = [[NSDate alloc] init];

Später mag ich das Datum auf den „jetzt“ zurückgesetzt, so dass ich dachte, dass

[date init];

oder

date = [date init];

könnte die Arbeit tun, aber sie tun es nicht. Stattdessen

[date release];
date = [[NSDate alloc] init];

funktioniert. Ich bin ein wenig verwirrt darüber, da in der Dokumentation zu - (id) init, heißt es:

  

Gibt ein NSDate Objekt und das aktuelle Datum und die Uhrzeit initialisiert.

und da date bereits vergeben, sollte es nicht braucht nur eine init Nachricht?

War es hilfreich?

Lösung

von alloc Denken und als logisch untrennbar Hälften eines Konstruktor init. Sie können nur Methoden mit „init“ einmal auf ein bestimmtes Objekt beginnend nennen - sobald das Objekt initialisiert wurde, und es ist ein Fehler, es wieder zu initialisieren. Dies gilt für jedes Objective-C-Objekt, nicht nur NSDate. Allerdings sind NSDate Objekte auch unveränderlich -. Einmal erstellt, können sie nicht ändern

Der Grund dieser Code funktioniert, weil Sie eine neue Instanz von NSDate erstellen, die die richtige Sache zu tun. Sie können [NSDate Datum] auch das Gleiche zu erreichen. Beachten Sie, dass es ein Objekt zurückgibt, die Sie tun (noch) nicht selbst, so dass Sie es behalten müssen, wenn Sie es brauchen zu halten um, und lassen Sie es später.

Bitte beachten Sie, dass, wenn Sie ein Objekt von jemandem erhalten, wird bereits initialisiert wurde. (Wenn nicht, es ist ein Programmierfehler in dem Code, der es vorgesehen, oder ist eine extrem seltene Ausnahme von der Regel.)

Andere Tipps

Wenn Sie das aktuelle Datum erhalten Sie nur verwenden können:

NSDate * now = [NSDate date];

Wenn Sie es behalten wollen, dann es retain.

NSDate * now = [[NSDate date] retain];

Sie können nicht NSDate mit init zurückgesetzt, init ist nur für das Objekt zum ersten Mal initialisiert wird.

Sie können nur ein anderes Datum bekommen:

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];

Die date Nachricht gibt autoreleased Instanz NSDate, daher die release oder autorelease.

Die autorelease ist für Fälle verwendet, in denen Sie nicht wollen, um sich Sorgen zu machen, wo genau müssen Sie das Objekt freizugeben - es in autorelease pool gestellt wird. Objekt in Autofreigabepool wird nach dem Ende der Veranstaltung Schleifeniterationslatenzzeit freigegeben wird, oder wenn Sie Veröffentlichung am Pool nennen ... (siehe mehr in Apple-docs über Speicherverwaltung).

Btw. die [NSDate date] ist eine bequeme Methode, es ist wahrscheinlich so etwas wie (nicht gleich sein, genau quaranteed aber funktionell ähnlich):

- (NSDate *)date
{
    return [[[NSDate alloc] init] autorelease];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top