Это нормально для автоматического выпуска UIViewControllers? - PullRequest
1 голос
/ 20 августа 2010

У меня есть несколько контроллеров представления:

StockTwitsTVViewController* stvViewController = [[[StockTwitsTVViewController alloc] initWithNibName:@"StockTwitsTVViewController" bundle:nil]autorelease];
    UINavigationController *stvNavController = [[UINavigationController alloc] initWithRootViewController:stvViewController];
    stvNavController.tabBarItem.image = [UIImage imageNamed:@"today-icon.png"];

    ScheduleViewController* scheduleViewController = [[[ScheduleViewController alloc] initWithNibName:@"ScheduleViewController" bundle:nil]autorelease];
    scheduleViewController.title = @"Archives";
    UINavigationController *scheduleNavController = [[UINavigationController alloc] initWithRootViewController:scheduleViewController];
    scheduleNavController.tabBarItem.image = [UIImage imageNamed:@"archived-icon.png"];

    stvTabBarController = [[UITabBarController alloc] init];
    stvTabBarController.delegate = self;
    stvTabBarController.viewControllers = [NSArray arrayWithObjects:stvNavController, scheduleNavController, nil];
    stvTabBarController.selectedViewController = stvNavController;

    [stvNavController release];
    [scheduleNavController release];

    [self presentModalViewController:stvTabBarController animated:YES];

Можно ли автоматически их разблокировать или лучше вручную выпускать? Почему?

Ответы [ 3 ]

1 голос
/ 20 августа 2010

То, что вы делаете в своем коде, прекрасно. Чтобы сделать вещи более согласованными, я бы также создал stdNavController и scheduleNavController в качестве автоматически выпущенных объектов.

1 голос
/ 20 августа 2010

Чтение mikeash.com: авторелиз быстр. .

То, что он не тестировал, было авто-релизом против выпуска.Когда я проводил тестирование, миллион [[[NSObject alloc] init] autorelease] плюс накладные расходы пула автоматического выпуска занимали порядка вдвое больше, чем [[[NSObject alloc] init] release].По общему признанию, я тестировал на 10.6 (предположительно, если он все еще пересчитан, так как я не включил GC), но относительная производительность все еще сохраняется.

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

Заботьтесь о производительности, когда это важно.Когда это произойдет, вы можете решить использовать CFString вместо NSString и доступ к ivar вместо доступа к свойству и вызовам функций вместо методов класса.В целом, однако, важно писать код, который легко поддерживать, даже если это означает использование ЦП на 1% больше.

0 голосов
/ 20 августа 2010

Автоматическое высвобождение позволит ОС выпустить релиз позднее, это означает, что когда закончится текущий цикл выполнения.

Выпуск информирует ОС о том, чтоидентификатор объекта больше не нужен, и выделенная память может быть освобождена.

Для производительности на iOS лучше использовать release вместо autorelease , потому что система можетнемедленно вернуть выделенную память.

...