2016-11-17 2 views
0

Ряд моих пользователей начал получать сбои после того, как я переписал код Objective-C в Swift. Я не могу воспроизвести вообще, когда связан с Xcode, и я не могу понять, почему только некоторые из моих пользователей получают крах. Я получил журналы из HockeyApp, и указанная причина: Selector name found in current argument registers: registeredContacts. Это массив, с которым я имею дело в своем коде, но ни при каких обстоятельствах я не могу заставить его сбой в отношении доступа или установки этого массива.Swift crash report function signature specialization Owned To Guaranteed

Я думаю, что это может быть мой синтаксис блока Swift и как я его вызываю из Objective-C. Моя Swift функция подписи:

func retrieveActivities(handler: (([WPActivity], Error?) -> Void)?) {

и я зову его в Objective-C с:

[[WPActivitiesManager shared] retrieveActivitiesWithHandler:nil];

Иногда я использую блок, но при запуске не нужно. Как я уже сказал, это не сбой для меня, и никаких предупреждений компилятора нет.

В верхней части моего журнала аварии:

Exception Type: SIGTRAP 
Exception Codes: #0 at 0x1001c0438 
Crashed Thread: 0 

Application Specific Information: 
Selector name found in current argument registers: registeredContacts 

Thread 0 Crashed: 
0 Waypoint        0x00000001001c0438 function signature specialization <Arg[0] = Owned To Guaranteed, Arg[1] = Owned To Guaranteed> of Waypoint.WPActivitiesManager.(retrieveActivities (handler : ([__ObjC.WPActivity], Swift.Error?) ->()?) ->()).(closure #2) with unmangled suffix "_merged" + 612 
1 Waypoint        0x00000001001c13a4 partial apply forwarder for Waypoint.WPActivitiesManager.(retrieveActivities (handler : ([__ObjC.WPActivity], Swift.Error?) ->()?) ->()).(closure #2) with unmangled suffix "_merged" + 64 
2 Foundation       0x0000000189ca2754 __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 12 
3 Foundation       0x0000000189be72c8 -[NSBlockOperation main] + 92 
4 Foundation       0x0000000189bd78c4 -[__NSOperationInternal _start:] + 616 
5 Foundation       0x0000000189ca4b00 __NSOQSchedule_f + 224 
6 libdispatch.dylib     0x00000001880691c0 _dispatch_client_callout + 12 
7 libdispatch.dylib     0x000000018806dd6c _dispatch_main_queue_callback_4CF + 996 
8 CoreFoundation      0x000000018918bf2c __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8 
9 CoreFoundation      0x0000000189189b18 __CFRunLoopRun + 1656 
10 CoreFoundation      0x00000001890b8048 CFRunLoopRunSpecific + 440 
11 GraphicsServices      0x000000018ab3e198 GSEventRunModal + 176 
12 UIKit        0x000000018f0a42fc -[UIApplication _run] + 680 
13 UIKit        0x000000018f09f034 UIApplicationMain + 204 
14 Waypoint        0x0000000100122888 main (main.m:14) 
15 libdyld.dylib      0x000000018809c5b8 start + 0 

Я подозреваю (добавлен HockeyApp я считаю) на registeredContacts комментарий здесь не имеет значения, но это ObjC/Swift вопрос. Любые идеи оценили.

Бревно, наконец, доступен в Xcode и у меня есть эта дополнительная информация:

Xcode log

ответ

2

Я подозреваю, что registeredContacts комментария (добавлено HockeyApp Я считаю) не имеет отношения здесь

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

SIGTRAP просто означает, что мы получили исключение. Исключение составляет в код (вернее, в процессе выполнения кода). Но вы, похоже, не получаете никакой информации о том, что это такое. Я предполагаю, что HockeyApp на самом деле мешает вам получить отчет real, который расскажет вам, что такое исключение.

Проблема, таким образом, где-то вretrieveActivities. Вы можете попытаться угадать, где, подсчитывая строки (вам сообщается количество строк в вашем методе, где на самом деле происходит сбой). Я полагаю, это может быть что-то простое, как доступ к массиву вне пределов. Таким образом, факт, что массив registeredContacts появляется здесь, весьма наводящий на размышления. Найдите registeredContacts доступ примерно в этот момент в методе.

+0

Это действительно связано с 'registeredContacts'. Блок обращается к этому массиву и перед вызовом блока я убеждаюсь, что массив является, по крайней мере, пустым 'NSArray', но по какой-то причине он должен был быть« nil »в очень редких случаях. Я добавил '?' В быстрый код, чтобы сделать его необязательным, и он устранил проблему в нескольких устройствах, у которых была проблема. Я должен сказать, что отчет о сбое (включая отчет от Apple) ничего полезного. – Raesu

+0

«Я должен сказать, что отчет о сбое ничего полезного» Да, так оно и есть с проблемами управления памятью.Я написал вопрос о переполнении стека, жалующийся на это всего пару дней назад, но мне пришлось удалить его, потому что это был не вопрос, это была просто жалоба. :) Кстати, тот факт, что вы говорите о NSArray в приложении Swift, - это плохой запах, и вы должны следить за ним немедленно. NSArray - это не Swift, и вы причиняете себе боль, используя его. – matt

+0

Ну, это потому, что я только недавно писал и переписывал части приложения в Свифте с 90% его в Obj-C. Отметил! – Raesu

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