domeniul de aplicare AutoreleasePool

voturi
6

Mă întrebam cum funcționează autorelese pe iPhone. Am crezut că , odată ce trimite un AutoreleasePool unui obiect este garantat să fie păstrate în până la sfârșitul domeniului de aplicare al Blocul a autoreleasefost trimis. Este corect?

Am fost inițializarea o vedere de la un vârf în applicationDidFinishLaunchingca mai jos:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

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

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

și punctul de vedere nu au prezentat deloc, tot ce era pe ecran a fost UIWindow

Acum , odată ce am scos autoreleasede la sfârșitul inițializarea controlerului toate mers bine de acolo.

Despre ce este vorba?

Noroc, K.

Întrebat 24/02/2009 la 14:57
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
13

Când sunați autorelease, vă dau dreptul de proprietate asupra obiectului la AutoreleasePool curent. Bucla rula creează un nou AutoreleasePool înainte de a transmite un eveniment (cum ar fi applicationDidFinishLaunching:) și distruge piscina că , atunci când se termină evenimentul.

Când vă dau dreptul de proprietate dumneavoastră LoginViewControllerla AutoreleasePool, acesta devine eliberat imediat după applicationDidFinishLaunching:întoarce. În cazul în care controlorul de vedere în sine deallocates, se elimină punctul de vedere din SuperView (fereastra în acest caz).

Delegatului cerere ar trebui să păstreze dreptul de proprietate asupra LoginViewControllerși - releasel în delegatului aplicației deallocmetoda (sau atunci când ați terminat cu datele de conectare și s- au mutat la o altă vizualizare).

Publicat 24/02/2009 la 20:50
sursa de către utilizator

voturi
4

Pentru a extinde răspunsul lui Don, acesta poate fi oarecum confuz pentru a spune „da dreptul de proprietate asupra obiectului la AutoreleasePool curent.“ Acest lucru ar putea fi înțeles greșit pentru a înțelege obiectul este garantat pentru a fi distruse atunci când AutoreleasePool este drenată. Acest lucru nu este corect (deși se va întâmpla în acest caz). Trimiterea -autoreleasecererilor că AutoreleasePool trimite un -releasemesaj atunci când acesta este drenat. În cazul în care -releasemesajul face retainCount = 0, atunci obiectul va fi distrus.

Deci, în scopul de a face ceea ce Don recomandă, trebuie să creați un Ivar pentru a ține evidența acestui controler de vedere. Explicația lui de ce punctul de vedere dispare este exact dreapta; dar nu doriți să scurgeri doar controler vizualizare. Vrei să dețină pe ea, și eliberați-l când ați terminat cu ea.

@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];
}
Publicat 28/04/2009 la 23:13
sursa de către utilizator

voturi
0

Din moment ce adăugați dvs. LoginViewControllerla AutoreleasePool este de a fi puse la sfârșitul buclei alerga. Atunci când se întâmplă acest lucru se elibereaza , de asemenea , punctul de vedere și îl elimină de a fi afișate.

Publicat 24/02/2009 la 18:50
sursa de către utilizator

voturi
0

Autoreleasepool este curățat la sfârșitul runloop. Acest lucru înseamnă că, atâta timp cât invoca metode și de a face lucruri, este încă acolo.

Nu văd de eroare în codul dvs., dar fereastra este reținut în mod corespunzător în exemplul dumneavoastră.

Publicat 24/02/2009 la 15:09
sursa de către utilizator

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