Проблема памяти контроллера UINavigation - PullRequest
0 голосов
/ 06 сентября 2011

Я столкнулся с проблемой сбоя моего приложения из-за несуществующих контроллеров представления. После обновления до последней версии XCode и наличия журналов устройств, которые символизируют должным образом, мои подозрения подтвердились. После нажатия кнопки «Назад» на странице вызывается popviewcontroller, и приложение вылетает. Вот точное сообщение об ошибке из моей системы:

Thread 0 Crashed:
0   libobjc.A.dylib                 0x341fcc98 0x341fa000 + 11416
1   libobjc.A.dylib                 0x34206506 0x341fa000 + 50438
2   libobjc.A.dylib                 0x341fe040 0x341fa000 + 16448
3   Holler                          0x00010a06 0x1000 + 64006
4   Holler                          0x0000e504 0x1000 + 54532
5   UIKit                           0x00036f08 -[UIViewController view] + 104
6   UIKit                           0x000455e8 -[UIViewController contentScrollView] + 16
7   UIKit                           0x00045458 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 24
8   UIKit                           0x00045356 -[UINavigationController _layoutViewController:] + 18
9   UIKit                           0x00044e2e -[UINavigationController _startTransition:fromViewController:toViewController:] + 374
10  UIKit                           0x00044c3c -[UINavigationController _startDeferredTransitionIfNeeded] + 176
11  UIKit                           0x00044b80 -[UINavigationController viewWillLayoutSubviews] + 8
12  UIKit                           0x00044b1c -[UILayoutContainerView layoutSubviews] + 132
13  UIKit                           0x000055f4 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 20
14  CoreFoundation                  0x0000befc -[NSObject(NSObject) performSelector:withObject:] + 16

Насколько я понимаю, UINavigationController сохраняет за собой все контроллеры представления в своем стеке. Однако по какой-то причине один из моих контроллеров представления исчезает. Я хочу подтвердить, что UINavigationController фактически сохраняет свои контроллеры представления на постоянной основе.

Мне удалось вызвать его сбой только после длительного периода времени (я засыпаю, перезагружаю приложение и нажимаю «Назад», и приложение вылетает). Есть ли что-то, связанное с жизненным циклом UINavigationController, или что-то в этом роде, о котором мне нужно знать? У кого-нибудь есть идеи о том, как начать сужать проблему?

Я предполагаю, что простой ответ - я перевыпустил контроллер представления, и его больше нет, когда я нажимаю назад. Однако я хочу узнать мнение других участников. Мысли?

1 Ответ

1 голос
/ 06 сентября 2011

да UINavigationController сохраняет UIViewController в своих стеках. (фактически он сохраняет стек UINavigationItems, который содержит некоторые данные о заголовке, backButton и т. д. и самом ViewController)

Полагаю, ваша проблема не в самом UIViewController, а в управлении вашей памятью.

Не забудьте, например, установить свой IBOutlets на nil в viewDidUnload методе , чтобы, когда ваше приложение получало предупреждение о памяти, и выпускало неэкранные представления (обычно это представления, присоединенные к ViewController не самый верхний viewController из UINavigationController), ваш IBOutlets перестает указывать на объекты и представления, которые больше не существуют (возможно, из-за сбоя, поскольку ваше приложение затем пытается получить доступ к памяти, которая была освобождена с тех пор)


PS: обратите внимание, что ваш краш-журнал не является полностью символическим, самая интересная часть (та, которая соответствует вашему собственному коду в вашем приложении "Holler") по-прежнему представляется как адреса методов вместо имен методов. ... который бы очень помог вам узнать, в каком методе вашего кода действительно происходит сбой, возможно, такой метод, как viewWillAppear или viewDidLoad

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