2015-07-08 2 views
0

Раньше у меня был цикл сохранения в одном из моих ViewControllers, но после много отладки я нашел виновника и исправил его. Но теперь мое приложение выходит из строя, если рассматриваемый VC присутствовал до его законного удаления, и я переключаю вид в свой TabBarController.Какие объекты ссылаются на мой ViewController слабо?

Я включил NSZombie и проверил отправленное сообщение, которое вызывает SIGABRT.

-[OrderViewController respondsToSelector:]: message sent to deallocated instance 0x151fdc00 

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

  1. Каковы возможные причины, по которым инфраструктура по-прежнему будет звонить на мой VC?
  2. Есть ли способ в Xcode, чтобы увидеть, какие объекты имеют слабую ссылку на этот конкретный экземпляр VC?
+1

Похоже, ваш OrderViewController зарегистрирован в качестве делегата для другого класса – oxigen

+0

Вы могли бы иметь действительную точку там.Есть ли способ проверить, какой объект (из которого класс) может иметь этот VC в качестве делегата? – physicalattraction

ответ

1

Я нашел способ отладить это.

Найти виновника

  • Место Исключение точки останова
  • ВОПРОИЗВЕДЕНИЕ аварии
  • В трассировке стека, нажмите на первый non __forwarding__ вопрос
  • Посмотрите на cuplrit, набрав в консоли в Xcode: (lldb) register read

Регистры общего назначения

ebx = 0x790257a0 
edi = 0x01119988 "tabBarController: shouldSelectViewController:" 
esi = 0x08a1fad1 "delegate" 
ebp = 0xbfff8778 
esp = 0xbfff8740 
eip = 0x0099415c UIKit`-[UITabBarController _tabBarItemClicked:] + 102 10 registers were unavailable. 

edi = отправляемое сообщение, esi = объект, который вы отправить сообщение, eip = почему сообщение было отправлено.

Это дает вам информацию, в которой отправляется сообщение nil.

Решение

Я нашел этот вопрос позже из-за этого. Я аннулировал делегата в ViewDidDisappear, но должен был сделать это в ViewWillDisappear, так как указатель, который я использовал, больше недействителен в ViewDidDisappear.

Этот код не работает. В этом случае self.tabBarController уже равен нулю, поэтому я не могу использовать эту ссылку для аннулирования делегата.

- (void)viewDidDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    self.tabBarController.delegate = nil; 
} 

Этот код действительно работает. Я добавил NSParameterAssert, чтобы проверить, что ссылка действительна до ее использования.

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    NSParameterAssert(self.tabBarController); 
    self.tabBarController.delegate = nil; 
} 
0

Если ваш контроллер вида является делегатом для любого другого объекта, установите для него свойство делегата нуль в dealloc контроллера просмотра.

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