2013-02-20 3 views
1

Я не могу найти, где проблема, но этот код рушится. Могу ли я высвободить любой объект?Является ли этот код выпуском?

settings = [[SettingsViewController alloc] initWithNibName:@"SettingsController" bundle:nil]; 
settings.hidesBottomBarWhenPushed = YES; 

NSArray * arrayWithRootController = [[NSArray alloc] initWithObjects:settings, nil]; 
[(UINavigationController*)([self.tabBar.viewControllers lastObject])setViewControllers:arrayWithRootController]; 
[arrayWithRootController release]; 
[settings release]; 

Если удалить строку

[settings release]; 

Приложение аварии это не распространяется. но я уверен, что это правильно. Может ли проблема быть в другом месте?

Любые идеи? Большое спасибо

+0

Можете ли вы разместить данные об аварии? Ошибка будет очень полезна. – Patrick

+1

@ user1394965 Вы ошибаетесь! iOS6 ничего не меняет в управлении памятью. Я считаю, что вы смешали его с автоматическим подсчетом ссылок. (Какой из них также доступен в iOS4/5!) – miho

+0

Если UINavigationController сохраняет свои контроллеры представлений, этот код выглядит правильно. Вы можете упростить некоторые вещи, используя фабричный метод NSArray '-arrayWithObject:', потому что результат автореализуется. – paulmelnikow

ответ

1

Вы не слишком завышаете в этом фрагменте, но, очевидно, что-то не так. Добавление контроллера корневого представления в массив сохранит его, но только для жизни массива. Когда массив умирает, все объекты внутри него также освобождаются (я думаю, что происходит здесь).

пару вещей, чтобы попробовать: Во-первых, убедитесь, что вы кладете ваш массив, где вы думаете:

[(UINavigationController*)([self.tabBar.viewControllers lastObject])setViewControllers:arrayWithRootController]; 

Что вы ожидаете [self.tabBar.viewControllers lastObject] быть? Вы уверены, что именно здесь вы хотите назначить новый массив? Если приемник недействителен, ваш массив не будет сохранен в следующей строке, что означает, что диспетчер представлений также будет выпущен.

Я не знаком с вашей архитектурой, но, похоже, вы назначаете массив контроллеров представлений контроллеру вида. self.tabBar является навигационным контроллером, и вы можете позвонить ему setViewControllers. Но self.tabBar.viewControllers lastObject ... предположительно это контроллер вида, но не обязательно контроллер навигации, он может не реагировать на setViewControllers (в этом случае он должен сбой, если только он не равен нулю, что, как я предполагаю, может быть).

Наконец, попробуйте использовать инструмент «Инструменты» Zombies, чтобы узнать, можете ли вы определить, откуда происходит непреднамеренный выпуск.

+0

Да, я помещаю массив в нужное место, я попытался добавить еще один контроллер представления вместо «настроек» и его не сбой. Проблема на 100% уверен в объекте настроек – pdrcabrod

+1

Используйте Zombies, чтобы узнать, где он будет выпущен .... – isaac

+0

[UITableView (UITableViewInternal) _createPreparedCellForGlobalRow: withIndexPath:] this is the method, где количество ссылок объекта достигает -1 – pdrcabrod

Смежные вопросы