2017-02-20 1 views
0

Я кодировал свой типичный случайный материал в Objective-C/iOS в течение нескольких лет.Я не могу отлаживать/отключать приложение. OTOH Crashlytics iOS сообщает о некоторых сбоях в полевых условиях для некоторых пользователей: NSInvalidArgumentException

Сегодня клиент, я имею дело с придумал это, по-видимому невинной Crashlytics аварии:

Fatal Exception: NSInvalidArgumentException 
0 CoreFoundation 0x193b0e1c0 \__exceptionPreprocess 
1 libobjc.A.dylib 0x19254855c objc_exception_throw 
2 CoreFoundation 0x193b15278 \__methodDescriptionForSelector 
3 CoreFoundation 0x193b12278 \___forwarding___ 
4 CoreFoundation 0x193a0c59c _CF_forwarding_prep_0 
5 MyProjectTargetName 0x100087518 -[BannerContainer pressed:] (BannerContainer.m:105) 
6 UIKit 0x199f3059c -[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] 
7 UIKit 0x199f33ca4 _UIGestureRecognizerSendTargetActions 
8 UIKit 0x199af52e8 _UIGestureRecognizerSendActions 
9 UIKit 0x199993828 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] 
10 UIKit 0x199f23ce8 _UIGestureEnvironmentUpdate 
... 

Дело в том, в строке 105, внутри BannerContainer.m «Bannercontainer нажата:» IBAction, есть Кажущаяся простой отведение:

if(self.banners==nil || [self.banners count]==0) 
    { 
     return; 
    } 

    NSInteger position=self.currentPosition; // both NSIntegers 

    if(IS_IPAD) // Macro working perfectly as of today 
    { 
     position=((UIButton *)sender).tag; // this is offending line 105 
    } 

Согласно Crahslytics, то NSInvalidArgumentException происходит сбой в линии 105 ... Но я не могу определить какой-либо «неверный аргумент» там. Вместо этого я бы сказал, что это всего лишь кнопка, а атрибут тега (NSInteger) присваивается переменной NSInteger (отправитель ВСЕГДА имеет кнопку, так как эта функция связана с 5 UIButtons внутри файла .xib). Эти 5 кнопок имеют 5 разных тегов (0, 1, 2, 3 и 4). если отправитель равен нулю, эта строка даже не падает (я вручную установил отправитель на нуль, чтобы проверить это требование 5 минут назад).

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

Я как-то невежествен. Любой намек? Любая отладка резиновой утки, которую кто-то может направить мне? Почему Crashlytics может найти аварийное состояние, которое я не могу найти в своем развитии?

Приветствия.

EDIT: У меня нет доступа к этой учетной записи Crashlytics. Этот крах, который я опубликовал, - это просто с .txt-дамп, который мой клиент отправил нам по электронной почте. У меня нет и доступа к этим серверам производственной среды приложений ни к моей учетной записи пользователя itunes connect. Я просто доставляю свой код своему клиенту, а затем компилирует, подписывает и загружает все с помощью своих учетных записей.

+0

@Issac Вы уверены, что всегда отправителем является UIButton? –

+0

этот IBAction связан только с 5 UIButtons внутри xib. Я не вижу, как/почему отправитель не должен быть UIButton. Моя проблема заключается в том, что я не могу сделать эту ошибку (!!), и мне бы хотелось (как это иногда может быть, как это иногда бывает, когда Crashlytics говорит) – Isaac

+0

Можете ли вы проверить, является ли отправитель UIButton, а затем сделать переадресацию ?, это должно исправить ваш сбой, и если это не UIButton, тогда отправляйте ошибку crashlytics, чтобы проверить, что происходит. –

ответ

0

Проблема «решена» (не могу сказать точно!).

Ну, как и ожидалось от отладки, отправитель, похоже, не был UIButton. Видимо, когда мое приложение разбилось под crashlytics, это было потому, что отправитель был на самом деле «UITapGestureRecognizer» (как некоторые из вас указали и были отчитаны от отладки).

Но еще кое-что случилось: мой клиент отправил мне лучшую информацию о его crashlytics crash.txt dump, то есть он сказал мне, что дополнительная информация появляется в некоторых других строках его веб-интерфейса Crashlytics, эти строки заставляют меня просматривать другие код моего приложения (это был код, написанный другим человеком в прошлом), и это привело меня к правильным противоречивым линиям.

Рассмотрение этих новых частей и файлов кода Наконец-то я обнаружил, что кто-то регистрировал жесты «вверх по моим кнопкам» (чтобы сказать это как-то) где-то еще в жизненном цикле этого контроллера. Этим жестам была назначена одна и та же функция «нажатая кнопка» IBAction, чем я связал свои реальные кнопки в IB.

Это имеет смысл в iPhone версии моего приложения (там, где у нас нет кнопок, но есть представления, поэтому нам нужно фиксировать жесты поверх них), но накладывается на ipad-версию моего приложения (crashlytics crashing один), который имеет кнопки для захвата кликов.

Итак, чтобы решить эту ситуацию, я просто удалил строки регистрации селектора для жестов касания, и больше никаких жестов нажатия не регистрируются, когда этот контроллер инициализируется (все это в режиме ipad).

Начиная с сегодняшнего дня Crashlytics больше не должен терпеть крах из-за этого, но я буду знать это наверняка через несколько недель после публикации этой версии.

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

Поздравления и благодарности за помощь и анализ.

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