Область автоматического выпуска - PullRequest
6 голосов
/ 24 февраля 2009

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

Я инициализировал представление из NIB в applicationDidFinishLaunching, как показано ниже:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

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

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

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

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

О чем это?

Ура, К.

Ответы [ 4 ]

13 голосов
/ 24 февраля 2009

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

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

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

4 голосов
/ 29 апреля 2009

Чтобы расширить ответ Дона, может быть несколько странно сказать, что «вы передаете право собственности на объект текущему пулу автоматического выпуска». Это может быть неправильно понято, чтобы означать, что объект гарантированно будет разрушен, когда пул авто-выпуска истощен. Это не правильно (хотя это произойдет в этом случае). При отправке -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];
}
0 голосов
/ 24 февраля 2009

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

0 голосов
/ 24 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...