Autorelease сфера

голоса
6

Мне было интересно , как autorelese работает на iPhone. Я , однако , что как только вы отправить autorelease на объект он гарантированно будет сохранен в до конца рамки блоке autoreleaseбыл послан. Это верно?

Я инициализация вида из СИБА в , applicationDidFinishLaunchingкак показано ниже:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

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

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

и вид не показывает вообще, все, что было на экране был UIWindow

Теперь , как только я удалил autoreleaseс конца инициализации контроллера все шло гладко оттуда.

О чем это?

Ура, К.

Задан 24/02/2009 в 14:57
источник пользователем
На других языках...                            


4 ответов

голоса
13

Когда вы звоните autorelease, вы даете право собственности на объект в текущем пуле autorelease. Цикл запуска создает новый autorelease бассейн , прежде чем он отправляет событие (например, applicationDidFinishLaunching:) и разрушает этот пул , когда событие заканчивается.

Когда вы даете право собственности на LoginViewControllerк autorelease бассейна, он освобождается сразу после applicationDidFinishLaunching:возвращения. Когда контроллер представления освобождает себя, он удаляет его вид из надтаблицы (ваше окно в данном случае).

Ваше приложение делегат должен сохранить право собственности из LoginViewControllerи releaseего в приложении делегата deallocметода (или когда вы закончите с вашим логином и перешли к другой точке зрения).

Ответил 24/02/2009 в 20:50
источник пользователем

голоса
4

Для того, чтобы расширить ответ Дона, это может быть несколько запутанным , чтобы сказать : «Вы даете право собственности на объект в текущем пуле autorelease.» Это может быть неправильно понят , чтобы означать объект гарантированно будет уничтожен , когда autorelease бассейн сливают. Это не правильно (хотя это произойдет в этом случае). Отправка -autoreleaseзапросов , что autorelease бассейн отправки -releaseсообщения , когда она разряжена. Если это -releaseсообщение делает retainCount = 0, то объект будет уничтожен.

Итак, для того, чтобы сделать то, что рекомендует Дон, вам нужно создать Ивар, чтобы следить за этой точки зрения контроллера. Его объяснение того, почему вид исчезает совершенно верно; но вы не хотите, чтобы просто просочиться контроллер представления. Вы хотите, чтобы удержать его, и отпустите ее, когда вы сделали с ним.

@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];
}
Ответил 28/04/2009 в 23:13
источник пользователем

голоса
0

Так как вы добавлять ваши LoginViewControllerв autorelease бассейне он выпускается в конце цикла выполнения. Когда это произойдет, также выпускает свой вид и удаляет его из отображается.

Ответил 24/02/2009 в 18:50
источник пользователем

голоса
0

Autoreleasepool очищается в конце runloop. Это означает, что до тех пор, как вы вызываете методы и делать вещи, он все еще там.

Я не вижу ошибку в коде, но окно правильно сохраняется в вашем примере.

Ответил 24/02/2009 в 15:09
источник пользователем

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