Ваш код замены неверен и, таким образом, иллюстрирует проблему, которую Apple пытается предотвратить. Вот ваш код:
self.navigationController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];
[self.view addSubview:[navigationController view]];
[navigationController release];
Вы оставили "я". в ваших ссылках. Возможно, вы имели в виду прямой доступ к ivar, но в этом случае вы создали очень запутанный код, смешав методы доступа и прямой доступ к ivar (и нарушили основное правило, используя прямой доступ к ivar за пределами средства доступа). Если нет, то вы хотели написать это:
self.navigationController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];
[self.view addSubview:[self.navigationController view]];
[self.navigationController release];
Эта последняя строка очень неправильная. Никогда не отправлять -релиз к результату вызова метода. Так что нет, то, как ты это делаешь, неверно.
Тем не менее, Apple и я не согласны с тем, как это сделать. Вот как я это делаю:
self.navigationController = [[[UINavigationController alloc]
initWithRootViewController:rootViewController] autorelease;
[self.view addSubview:[self.navigationController view]];
Мне нравится -autorelease, потому что я считаю, что он предотвращает ошибки. Чем дальше отделены от alloc и release, тем более вероятно, что разработчик внесет утечку памяти (например, добавив return). autorelease позволяет избежать этого, сохраняя вместе функции сохранения и освобождения, что делает намерение использовать это как временную переменную более понятным и, как правило, значительно упрощает проверку кода.
Apple имеет тенденцию не соглашаться со мной в своем примере кода, потому что они подчеркивают производительность, используя релиз по сравнению с автоматическим выпуском. Я считаю, что это неправильная оптимизация, так как этот объект не будет освобожден во время этого цикла выполнения в любом случае (поэтому память не сохраняется), и я считаю, что очень небольшое снижение производительности автоматического выпуска больше, чем восполняется уменьшение утечек памяти из-за неправильного использования релиза.
Дебаты об автоматическом выпуске и выпуске заполнены оттенками серого (я, конечно, использую выпуск непосредственно в циклах), и разные разработчики используют разные подходы, но ваш код замены не подходит для этого в любом случае.