NSDate init otázka týkající se správy paměti v Objective-C

hlasů
4

Mám NSDateobjekt vytvořený

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

Později, chci obnovit data k „teď“, takže jsem si myslel, že

[date init];

nebo

date = [date init];

mohl dělat svou práci, ale oni ne. místo toho,

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

funguje. Jsem trochu zmatená o tom, protože v dokumentaci - (id) init, se píše:

Vrací objekt NSDate inicializovaný na aktuální datum a čas.

a od té doby dateje již přiděleno, by to nemělo prostě potřebují initzprávu?

Položena 06/08/2009 v 20:02
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
9

Přemýšlejte o alloca initlogicky neoddělitelné poloviny konstruktoru. Můžete volat pouze metody začínající „init“ jednou na daný objekt - jakmile je objekt byl inicializován, a to je chyba ji znovu inicializovat. To platí pro libovolný objekt Objective-C, a to nejen NSDate. Nicméně, NSDate objekty jsou také neměnná - jednou vytvořený, nemohou měnit.

Důvodem, proč tento kód funguje proto, že budete vytvářet novou instanci NSDate, což je správná věc. Můžete také použít [datum NSDate] dosáhnout totéž. Uvědomte si, že ji vrátí objekt, který vy ne (zatím) sám, takže budete muset udržet to, pokud budete potřebovat, aby jej kolem sebe, a uvolnit jej později.

Uvědomte si, že pokud se zobrazí objekt od někoho, že již byl inicializován. (Pokud ne, je to chyba programování v kódu, který ji poskytl, nebo je mimořádně neobvyklé výjimka z pravidla.)

Odpovězeno 06/08/2009 v 20:35
zdroj uživatelem

hlasů
5

Chcete-li získat aktuální datum, stačí použít:

NSDate * now = [NSDate date];

Pokud chcete, aby ji udrželi a pak retainji.

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

Nelze obnovit NSDates init init je určen pouze pro inicializaci objekt poprvé.

Dalo by se prostě dostat jiný termín:

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

dateZpráva vrací autoreleasedinstanci NSDate, od této doby releasenebo autorelease.

autoreleaseSe používá v případech, kdy nechcete se starat o tom, kde přesně je třeba uvolnit objekt - to je dát do autorelease pool. Objekt v autorelease bazénu se uvolní po skončení akce smyčky iterace, nebo při volání propuštění na bazén ... (více viz Apple dokumentů o správě paměti).

Mimochodem. [NSDate date]je metoda pohodlí je to asi něco jako (ne quaranteed být přesně stejný, ale funkčně podobné):

- (NSDate *)date
{
    return [[[NSDate alloc] init] autorelease];
}
Odpovězeno 27/01/2010 v 05:14
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more