autorelease scope

stemmen
6

Ik vroeg me af hoe de autorelese werkt op de iPhone. Ik dacht dat als je eenmaal stuur een autorelease aan een object is het gegarandeerd te worden vastgehouden in tot het einde van de omvang van het blok het autoreleasewerd verzonden. Is dat correct?

Ik was het initialiseren van een uitzicht vanaf een NIB in het applicationDidFinishLaunchingzoals hieronder:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

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

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

en het uitzicht helemaal niet laten zien, al was er op het scherm was de UIWindow

Nu zodra ik verwijderde de autoreleasevanaf het einde van de controller initialisatie alle ging vlot vanaf daar.

Waar gaat dit over?

Cheers, K.

De vraag is gesteld op 24/02/2009 om 14:57
bron van user
In andere talen...                            


4 antwoorden

stemmen
13

Als u belt autorelease, eigendom van het object op de huidige AutoRelease zwembad geven. De run lus een nieuw AutoRelease pool voordat verzendt een gebeurtenis (bijvoorbeeld applicationDidFinishLaunching:) en vernietigt dat zwembad als de gebeurtenis eindigt.

Wanneer u eigendom van uw geven LoginViewControlleraan de AutoRelease zwembad, het wordt vrijgegeven zodra het applicationDidFinishLaunching:rendement. Als de view controller zelf deallocates, het verwijdert het uitzicht vanaf de superview (je raam in dit geval).

Uw sollicitatie afgevaardigde moet eigendom van de te houden LoginViewControlleren releasedeze in de app afgevaardigde deallocmethode (of wanneer je klaar bent met uw login en zijn verhuisd naar een andere weergave).

antwoordde op 24/02/2009 om 20:50
bron van user

stemmen
4

Om uit te breiden over het antwoord van Don's, kan het enigszins verwarrend te zeggen "je het eigendom van het object op de huidige AutoRelease zwembad te geven." Deze verkeerd begrepen kunnen worden om het object te betekenen is gegarandeerd worden vernietigd wanneer de AutoRelease zwembad wordt afgevoerd. Dit is niet correct (hoewel het zal gebeuren in dit geval). Het versturen van -autoreleasede verzoeken dat de AutoRelease zwembad stuur dan een -releasebericht wanneer het wordt afgevoerd. Als dat -releasebericht retainCount = 0 maakt, dan wordt het object worden vernietigd.

Dus, om te doen wat Don aanbeveelt, moet u een Ivar maken om van deze opvatting controller te houden. Zijn uitleg waarom het zicht verdwijnt is precies goed; maar u wilt niet alleen lekken van het uitzicht controller. U wilt vast te houden, en laat hem los als je klaar bent met het.

@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];
}
antwoordde op 28/04/2009 om 23:13
bron van user

stemmen
0

Omdat je je toe te voegen LoginViewControlleraan de AutoRelease zwembad het wordt vrijgegeven op het einde van de run lus. Wanneer dat gebeurt het releases ook zijn view en verwijdert deze worden weergegeven.

antwoordde op 24/02/2009 om 18:50
bron van user

stemmen
0

De autoreleasepool wordt gereinigd aan het einde van de runLoop. Dit betekent dat zolang je methoden aanroepen en dingen doen, het is er nog steeds.

Ik wil niet de fout in uw code, maar het venster is goed bewaard in uw voorbeeld.

antwoordde op 24/02/2009 om 15:09
bron van user

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