autorelease rozsah

hlasů
6

Zajímalo by mě, jak autorelese pracuje na iPhone. I přesto, že jakmile vás poslat autorelease k objektu je zaručeno, aby se udržel v až do konce rozsahu Blokovat autoreleasebyl odeslán. Je to správně?

Byl jsem inicializace pohled z hrotem v applicationDidFinishLaunchingníže:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

    loginViewController = [[[LoginViewController alloc] initWithNibName:@LoginView bundle:nil] autorelease];

    [window addSubview: [loginViewController view]];
    [window makeKeyAndVisible];
}

a pohled neukázal vůbec, všechno, co se na obrazovce byl UIWindow

Teď, když jsem odstraněna autoreleasez konce inicializace regulátoru šlo všechno hladce odtamtud dál.

O čem to je?

Na zdraví, K.

Položena 24/02/2009 v 14:57
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
13

Když zavoláte autorelease, dáte vlastnictví objektu k aktuálnímu autorelease bazénu. Běh smyčka vytvoří nový autorelease bazén před tím, než odešle událost (například applicationDidFinishLaunching:) a ničí, že bazén, kdy událost končí.

Když dáte vlastnictví vašeho LoginViewControllerna autorelease bazénu, dostane propuštěn bezprostředně po applicationDidFinishLaunching:přiznání. Pokud řídicí pohled zruší přidělení sám, odstraňuje svůj názor z SuperView (okna v tomto případě).

Vaše žádost zástupce by měl mít vlastnictví z LoginViewControllera releaseto v app delegáta deallocmetodou (nebo když jste udělal se svým přihlášením a již přesunul do jiného pohledu).

Odpovězeno 24/02/2009 v 20:50
zdroj uživatelem

hlasů
4

Rozšířit na Donově odpověď, může být poněkud matoucí říkat „dát vlastnictví objektu k aktuálnímu autorelease bazénu.“ To by mohlo být špatně pochopeno tak, že znamená objekt je zaručeno, že bude zničen, když je autorelease bazén vypustit. To není správné (i když se to stane v tomto případě). Odesílání -autoreleasežádostí, aby autorelease bazénu i odesílání -releasezprávy, když je vyčerpaný. V případě, že -releasezpráva je retainCount = 0, pak bude objekt zničen.

Tak, aby se dělat to, co Don je doporučující, je třeba vytvořit Ivar sledovat tohoto pohledu regulátoru. Jeho vysvětlení, proč je pohled zmizí, je úplně v pořádku; ale nechcete, aby jen prosakovat kontroleru pohledu. Chcete-li držet jej a uvolnit ji, když budete hotovi s ním.

@interface ... {
   LoginViewController *_loginViewController;
}

@property (readwrite, retain) LoginViewController *loginViewController;

@implementation ...
@synthesize loginViewController = _loginViewController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    self.loginViewController = [[[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil] autorelease];

    [window addSubview: [loginViewController view]];
    [window makeKeyAndVisible];
}

- (void)dealloc {
    [_loginViewController release]; _loginViewController = nil;
    [super dealloc];
}
Odpovězeno 28/04/2009 v 23:13
zdroj uživatelem

hlasů
0

Vzhledem k tomu, že jste přidání vaší LoginViewControllerk autorelease bazénu to byl propuštěn na konci běhu smyčky. Když se to stane, ale také uvolní své pohled a odstraní ji z právě zobrazena.

Odpovězeno 24/02/2009 v 18:50
zdroj uživatelem

hlasů
0

Autoreleasepool se čistí na konci runloop. To znamená, že tak dlouho, jak vyvolat metody a dělat věci, je to tam pořád.

Nevidím chyby v kódu, ale okno je správně zachovány v příkladu.

Odpovězeno 24/02/2009 v 15:09
zdroj uživatelem

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