autoutgivelses omfang

stemmer
6

Jeg lurte på hvordan autorelese fungerer på iPhone. Jeg skjønt at når du sender en autoutgivelses til et objekt det er garantert å bli beholdt i til slutten av omfanget av blokken autoreleaseble sendt. Er det riktig?

Jeg ble initialisering en visning fra et NIB i applicationDidFinishLaunchinglike nedenfor:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

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

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

og utsikten viste ikke i det hele tatt, alt var der på skjermen var det UIWindow

Nå når jeg fjernet autoreleasefra slutten av kontrolleren initialisering alt gikk glatt derfra.

Hva handler dette om?

Skål, K.

Publisert på 24/02/2009 klokken 13:57
kilden bruker
På andre språk...                            


4 svar

stemmer
13

Når du ringer autorelease, gir deg eierskap av objektet til dagens autoutgivelsesutvalg. Kjøringen sløyfen skaper en ny autoutgivelsesbasseng før det sender en hendelse (for eksempel applicationDidFinishLaunching:) og ødelegger dette bassenget når arrangementet er ferdig.

Når du gir eierskap av LoginViewControllerden autoutgivelsesutvalg, blir det gitt ut like etter applicationDidFinishLaunching:avkastning. Når visningen kontrolleren deallokerer selv, fjerner den sin utsikt fra Super (vinduet i dette tilfellet).

Søknaden delegat bør holde eierskapet til LoginViewControllerog releasedet i appdelegate deallocmetode (eller når du er ferdig med påloggingen, og har flyttet til en annen visning).

Svarte 24/02/2009 kl. 19:50
kilden bruker

stemmer
4

Å utvide på Don svar, kan det være litt forvirrende å si "du gir eierskap av objektet til dagens autoutgivelsesutvalg." Dette kan bli misforstått til å bety objektet er garantert å bli ødelagt når autoutgivelsesutvalg er drenert. Dette er ikke korrekt (selv om det vil skje i dette tilfellet). Sende -autoreleaseforespørsler som autoutgivelsesutvalg sender en -releasemelding når det er drenert. Hvis det -releasemeldingen gjør retainCount = 0, så gjenstanden vil bli ødelagt.

Så, for å gjøre det som Don er å anbefale, må du opprette en ivar å holde styr på dette synet kontrolleren. Hans forklaring på hvorfor utsikten forsvinner er helt riktig; men du ønsker ikke å bare lekke visningen kontrolleren. Du ønsker å holde på den, og slipp den når du er ferdig med det.

@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];
}
Svarte 28/04/2009 kl. 22:13
kilden bruker

stemmer
0

Siden du legger inn LoginViewControllertil autoutgivelsesutvalg det blir gitt ut på slutten av kjøringen loop. Når det skjer det frigjør også sin syn og fjerner den fra å bli vist.

Svarte 24/02/2009 kl. 17:50
kilden bruker

stemmer
0

Den autoreleasepool blir renset ved slutten av den runloop. Dette betyr så lenge du starter metoder og gjøre ting, det er fortsatt der.

Jeg ser ikke feil i koden din, men vinduet er beholdt riktig i ditt eksempel.

Svarte 24/02/2009 kl. 14:09
kilden bruker

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