Для присвоения собственности, вы должны использовать
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
или
[tabBarController release];
tabBarController = [[UITabBarController alloc] init];
(не забудьте сначала освободить предыдущее значение)
Установщики / получатели свойств должны нести единоличную ответственность за сохранение / освобождение переменной экземпляра. Что произойдет, если вы (или кто-то еще) измените установщик свойств, чтобы взять копию входных данных вместо того, чтобы сохранить их? В этом случае вы перезагружаете переменную экземпляра и пропускаете исходный объект.
По сути, вы отправляете сообщение с частными побочными эффектами, а затем используете знания этих личных деталей, выпуская переменную экземпляра в следующей строке. т. е. ваш код такой же, как:
[self setTabBarControler:[[UITabBarController alloc] init]];
/* Relying on knowledge of the instance variable is bad here, setTabBarController
might do something different in the future */
[tabBarController release];
Даже если вы полностью контролируете класс, вы все равно должны придерживаться основных принципов абстракции и инкапсуляции. Оставьте сохранение / освобождение переменных экземпляра для реализации базового свойства.