Вот ситуация: Hockeyapp и testflight каждый сейчас и потом жалуются мнеСоветы о том, как поймать «попытку вставить объект ноль» от устройства, необходимого
«пытается вставить ноль объект»
в изменяемых словарях/массивах. Я знаю, что правильно все время проверять ноль, и я делаю, когда это имеет смысл. Наши тестеры не могут поймать эти сбои, но пользователи AppStore, очевидно, могут.
Я предполагаю, что иногда сервер возвращает NSNulls, когда это не должно. Поэтому, чтобы не вставлять проверки на нуль во всем огромном проекте, моя идея состояла в том, чтобы создать отдельную цель для тестеров и использовать метод swizzling для классов коллекции. Скажите, я заменил бы insertObject:atIndex
моим swizzled_insertObject:atIndex
, где, если объект фактически равен нулю, я регистрирую/показываю описательный отчет перед его сбоем.
Дело в том, что я не могу использовать swizzling для __NSPlaceholderDictionary
или __NSArrayM
(просто потому, что я не могу сделать категорию на частных занятиях), и это меня огорчает.
Итак, в основном я прошу совета о том, как поймать эти неприятные редкие аварии. Одно из решений, которое я имею в виду, это использование блоков try-catch, я знаю, что они дороги в Objective-c, поэтому я не буду использовать их в производстве, просто для тестеров. Но методы, окруженные try-catche
, в окружении #ifdef
- #endif
-s, стирают всю читаемость кода. Поэтому я ищу более элегантное решение. Спасибо.
Update: стек следы unfortunaely не очень описательные, вот что я получаю
Exception Type: SIGABRT
Exception Codes: #0 at 0x3a378350
Crashed Thread: 0
Application Specific Information:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[2]'
Last Exception Backtrace:
0 CoreFoundation 0x321522a3 <redacted> + 163
1 libobjc.A.dylib 0x39e7a97f _objc_exception_throw + 31
2 CoreFoundation 0x320a355f <redacted> + 135
3 CoreFoundation 0x320da0d3 <redacted> + 51
....
Вам не нужно проверять 'nil' всюду. Трассировки стека должны сообщать вам, какая строка кода в вашем приложении вызывает проблему. Исправьте этот конкретный код. Но не просто проверяйте «nil». Определите, почему вы получаете «нуль» в первую очередь. – rmaddy
В этом проблема - я не могу определить, почему и где я получаю ноль.и трассировки стека не всегда описывают все, что я получаю, например: erminating app из-за неотображенного исключения «NSInvalidArgumentException», причина: «*** - [__ NSPlaceholderDictionary initWithObjects: forKeys: count:]: попытка вставить нулевой объект из объектов [ 2] ' – dariaa
Еще одна вещь: Вы, кажется, путаете 'nil' с' NSNull'. 'NSNull' - объект; он обычно используется в качестве заполнителя. – trudyscousin