zakres autorelease

głosy
6

Zastanawiałem się, w jaki sposób autorelese działa na iPhone. I mimo, że po wysłaniu autorelease do obiektu jest gwarantowane mają być zatrzymywane w do końca zakresu blokują autoreleasezostał wysłany. Czy to jest poprawne?

Byłem inicjalizacji widok z NIB w applicationDidFinishLaunchingjak poniżej:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

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

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

a widok nie wykazują w ogóle, wszystko było na ekran było UIWindow

Teraz kiedy już usunięte autoreleasez końca inicjalizacji kontrolera wszystko szło gładko stamtąd.

O czym to jest?

Zdrowie K.

Utwórz 24/02/2009 o 14:57
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
13

Podczas rozmowy telefonicznej autorelease, dajesz własność obiektu do obecnej puli autorelease. Pętla run tworzy nową pulę autorelease zanim wywoła zdarzenie (na przykład applicationDidFinishLaunching:) i niszczy że basen gdy zdarzenie zakończy.

Kiedy dajesz własność LoginViewControllerdo puli autorelease, zostaje zwolniony tuż po applicationDidFinishLaunching:zwrotów. Kiedy kontroler widok dealokuje się, usuwa jej widok z okna SuperView (w tym przypadku).

Twój delegat aplikacja powinna zachować na własność LoginViewControlleri releaseto w App delegata deallocmetody (lub gdy skończysz z loginu i zostały przeniesione do innego widoku).

Odpowiedział 24/02/2009 o 20:50
źródło użytkownik

głosy
4

Aby rozwinąć na odpowiedź Dona, może to być nieco mylące, aby powiedzieć „dasz własność obiektu do obecnej puli autorelease.” To może być źle rozumieć obiekt jest gwarantowana być zniszczone, gdy pula autorelease jest odprowadzana. To nie jest poprawna (choć nastąpi to w tym przypadku). Wysyłanie -autoreleaseżądania że pula autorelease wysyłają -releasekomunikat, gdy jest ona odprowadzana. Jeśli ta -releasewiadomość sprawia retainCount = 0, wówczas obiekt zostanie zniszczony.

Tak, aby robić to, co Don zaleca, trzeba stworzyć ivar śledzić tego kontrolera widoku. Jego wyjaśnienie, dlaczego widok znika jest dokładnie prawo; ale nie chcesz po prostu wyciek kontroler widoku. Chcesz trzymać się go i zwolnić go, gdy jesteś z nim zrobić.

@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];
}
Odpowiedział 28/04/2009 o 23:13
źródło użytkownik

głosy
0

Skoro dodać LoginViewControllerdo puli autorelease to być wydany pod koniec pętli biegu. Kiedy tak się dzieje, ale również uwalnia Widok i usuwa on być wyświetlane.

Odpowiedział 24/02/2009 o 18:50
źródło użytkownik

głosy
0

Autoreleasepool jest czyszczone na koniec runloop. Oznacza to, jak długo wywoływać metody i robić rzeczy, to wciąż istnieje.

Nie widzę błędu w kodzie, ale okno jest zachowana prawidłowo w swoim przykładzie.

Odpowiedział 24/02/2009 o 15:09
źródło użytkownik

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