sallanmasını kapsam

oy
6

Autorelese iPhone'da nasıl çalıştığını merak ediyorum. Ama bunun senin kez bir nesneye otomatik salma göndermek garantili olduğu bloğun kapsamına sonuna kadar tutulmak üzere autoreleasegönderildi. Bu doğru mu?

Ben bir ELVES bir görünüm başlatılırken applicationDidFinishLaunchingaşağıdaki gibi:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

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

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

Ekran oldu ve görünümü hiç göstermedi, tüm yoktu UIWindow

Şimdi bir kez kaldırdım autoreleasehepsi orada andan itibaren pürüzsüz gitti kontrolör başlatma sonundan.

Bu ne hakkında?

Alkış, K.

Oluştur 24/02/2009 saat 14:57
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
13

Aradığınızda autorelease, geçerli sallanmasını havuzuna nesnenin sahipliğini verir. O (gibi bir olayı göndermeden önce çalışma döngüsü yeni sallanmasını havuzu oluşturur applicationDidFinishLaunching:) ve havuz olayı bitince o yok eder.

Aşağıdaki konularda sahipliğini verdiğinde LoginViewControllersallanmasını havuzuna, sadece sonra serbest olur applicationDidFinishLaunching:getiriler. Görünüm denetleyicisi kendisini kaldırır, bu Superview onun görünümü (bu durumda sizin pencere) kaldırır.

Başvurunuz temsilci sahipliğini tutmalı LoginViewControllerve releaseuygulama temsilcinizin bunu deallocyöntemi (ya da giriş ile bitti ve başka görünüme geçti erdiğinde).

Cevap 24/02/2009 saat 20:50
kaynak kullanıcı

oy
4

Don'un yanıta genişletmek için, söylemek biraz kafa karıştırıcı olabilir "geçerli sallanmasını havuzuna nesnenin sahipliğini verir." Bu nesneyi anlamında yanlış olabilir sallanmasını havuzu boşaltıldığında yok edilmesi sağlanır. (Bu durumda ne olacak olsa da) Bu doğru değil. Gönderme -autoreleasesallanmasını havuzu göndermesini ister -releaseo boşaltıldığında mesajı. Bu ise -releasemesaj retainCount = 0 yapar, daha sonra nesnenin yok edilecektir.

Evet Don tavsiye ne yapmak için, bu görünüm denetleyicisi izlemek için bir ivar oluşturmanız gerekir. görünümü kaybolur neden Onun açıklama tam olarak doğru değildir; ama sadece görünüm denetleyicisi sızıntı istemiyoruz. Sen sakla, ve onunla bitince bırakın istiyorum.

@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];
}
Cevap 28/04/2009 saat 23:13
kaynak kullanıcı

oy
0

Eğer Senin ekleyerek konum beri LoginViewControllersallanmasını havuzuna o çalışma döngünün sonunda piyasaya ediliyor. Bu olduğu zaman o da onun görünümü serbest bırakır ve görüntülenmesini kaldırır.

Cevap 24/02/2009 saat 18:50
kaynak kullanıcı

oy
0

autoreleasepool runloop sonunda temizlenir. Eğer yöntemleri çağırmak ve şeyler yapmak gibi bu hala orada, sürece demektir.

Ben senin kodunda hata görmüyorum ama Pencere sizin örnekte düzgün korunur.

Cevap 24/02/2009 saat 15:09
kaynak kullanıcı

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