Перевод трассировки стека iOS - SIGSEGV / SEGV_ACCERR в viewDidUnload

Я предполагаю, что это проблема жизненного цикла. Приложение получает предупреждение о памяти и пытается выгрузить некоторые элементы пользовательского интерфейса. Но я не уверен на 100%, как интерпретировать ошибку в контексте последнего сообщенного элемента в трассировке стека.

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0xa0d9f968
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                     0x361dc026 objc_msgSend_stret + 18
1   TheApp                              0x000b4d31 -**[TheAppFeedController removeAdView]** (TheAppFeedController.m:**189**)
2   TheApp                              0x0000d68d -[TheAppViewController viewDidUnload] (TheAppViewController.m:177)
3   TheApp                              0x000b4a63 -[TheAppFeedController viewDidUnload] (TheAppFeedController.m:137)
4   UIKit                               0x32e66a37 -[UIViewController unloadViewForced:] + 251
5   UIKit                               0x32fae3ad -[UIViewController purgeMemoryForReason:] + 65

Таким образом, трассировка стека указывает на этот метод, который на самом деле не имеет смысла, почему он вызывает эту ошибку.

-(void) removeAdView {
    [super removeAdView];
    [self fixLayoutForAdRemoval:self.tableView];
}

Когда вы просматриваете стек, я заметил одну вещь: [super viewDidUnload] вызывается как первая строка кода. Поэтому я переместил его в самый низ, после того как проделал всю свою "разгрузочную" работу. Кажется, в Интернете есть некоторые разногласия, действительно ли это имеет значение или нет, некоторые ответы SO говорят, что метод viewDidUnload суперкласса ничего, и поэтому не имеет значения, назовете ли вы это в начале или в конце.

Итак, я внес это изменение, но, поскольку мне никогда не удавалось воспроизвести эту ошибку, я не уверен, что это на самом деле исправление. Хотел узнать больше мнений по проблеме, чтобы убедиться, что мои рассуждения верны.


person Joel Martinez    schedule 24.10.2012    source источник
comment
Не уверен, что понял: при перемещении [super viewDidUnload] сбой был исправлен; Если вы восстановите его как первую строку, произойдет сбой; это то, что вы говорите?   -  person sergio    schedule 24.10.2012
comment
Я упомянул, что мне никогда не удавалось воспроизвести эту ошибку. Я получаю этот журнал сбоев через HockeyApp из дикой природы ... поэтому я хочу решить эту проблему для наших клиентов   -  person Joel Martinez    schedule 24.10.2012
comment
Какая строка TheAppFeedController.m line 189?   -  person Joachim Isaksson    schedule 24.10.2012
comment
Это странная часть, 189 - это закрывающая скобка метода removeAdView: - /   -  person Joel Martinez    schedule 24.10.2012


Ответы (1)


[super removeAdView];
[self fixLayoutForAdRemoval:self.tableView];

Если removeAdView разрушает части себя; если это приводит к освобождению self до точки освобождения, то последующий вызов fixLayoutForAdRemoval: может легко завершиться ошибкой.

Включите обнаружение зомби в инструментах и ​​посмотрите, что он обнаруживает.

person bbum    schedule 24.10.2012
comment
У меня создалось впечатление, что viewDidUnload не будет вызываться после освобождения. Кроме того, зомби ничего не показали ... помните, мне не удалось воспроизвести это локально; это было обнаружено только в процессе создания отчетов журнала сбоев (hockeyapp). - person Joel Martinez; 24.10.2012
comment
О, хорошо. Хм ... с включенной оптимизацией компилятор иногда теряет отслеживание номеров строк, поэтому отсутствие номера строки не является чем-то необычным. Если журнал сбоев включает список динамических библиотек в игре, проверьте, не находится ли он на взломанном устройстве. - person bbum; 24.10.2012
comment
Есть ли конкретная библиотека, которую я должен искать, чтобы определить, работает ли она на взломанном устройстве? - person Joel Martinez; 24.10.2012
comment
Обычно в списке dylib вы увидите что-то вроде Cydia или libBac0n. Или библиотеки в странных местах. - person bbum; 24.10.2012