2017-02-14 115 views
1

編輯:我已經確定下面發生只有在iPad的視網膜模擬器和我的iPad迷你3測試設備。它會在這些目標上發生100%的時間,而不會出現在任何其他iPad或iPhone模擬器(iPad Air/Air 2; iPad Pro; iPhone 5至7 Plus)上。我沒有任何其他設備進行測試。;沒有殭屍活動


我有寫入夫特一個應用程序,顯示一個UITableView其中我添加了一個UILongPressGestureRecognizer給每個小區內的自定義視圖。該應用程序運行良好,直到我長按某一行上,在該點處的應用程序與

線程1停止:EXC_BAD_ACCESS(碼= 1,地址= 0xd08600b6)

(地址變化很大並且看起來非常隨機,有時它是0x0)。當崩潰發生時,調試控制檯中不會顯示任何輸出。 XCode本身打開到我的應用程序委託的類聲明的第一行。

我在我的長按事件處理程序方法的第一行放置了一個斷點,但應用程序在命中斷點之前崩潰了。我還添加了一個異常斷點,但它也沒有發現問題。

我已經在計劃中啓用了殭屍對象,但沒有顯示出來。我試過使用Instruments和殭屍模板來運行應用程序;該應用只是停止,樂器不會標記任何殭屍活動。 XCode的分析報告沒有問題。

我不知道它是如何相關的,但是自從我第一次存檔應用程序以準備分發給測試人員以來,這個問題是新的。在此之前,該應用程序在模擬器和測試設備上完美無缺地工作。首次在設備上安裝並運行分發.ipa文件時,問題首次顯現。然後我回到模擬器並發現相同的行爲。我已經清理了該項目,清理了構建文件夾,重新啓動了我的開發機器,並完成了我所能想到的以純粹狀態運行的所有內容。沒有不同。

我不知道如何在追蹤這個過程中取得進展。任何建議將不勝感激。

更多信息

看來,崩潰的是,傳遞給UILongPressGestureRecognizer初始化的#selector對象內發生的事情。下面是從調試導航窗格中的調用堆棧:

#0 0x006e7295在objc_retain()
#1 0x0007529f在@objc TikkunRowView。onLongPress(發件人:UILongPressGestureRecognizer,forEvent:的UIEvent) - >()()
#2 0x01cc6d3b在 - [UIGestureRecognizerTarget _sendActionWithGestureRecognizer:]()
#3 0x01ccf75e在_UIGestureRecognizerSendTargetActions()
#4 0x01cccdee在_UIGestureRecognizerSendActions()
#5 0x01ccbca8在 - [UIGestureRecognizer _updateGestureWithEvent:buttonEvent:]()
#6 0x01cb6670在_UIGestureEnvironmentUpdate()

而這裏的在#1上面的代碼,其中發生崩潰(所述calll在偏移< +42 >):

Tikkun Sample`@objc TikkunRowView.onLongPress(sender : UILongPressGestureRecognizer, forEvent : UIEvent) ->(): 
    0x60270 <+0>: pushl %ebp 
    0x60271 <+1>: movl %esp, %ebp 
    0x60273 <+3>: pushl %esi 
    0x60274 <+4>: subl $0x24, %esp 
    0x60277 <+7>: movl 0x14(%ebp), %eax 
    0x6027a <+10>: movl 0x10(%ebp), %ecx 
    0x6027d <+13>: movl 0x8(%ebp), %edx 
    0x60280 <+16>: movl %ecx, (%esp) 
    0x60283 <+19>: movl %ecx, -0x8(%ebp) 
    0x60286 <+22>: movl %edx, -0xc(%ebp) 
    0x60289 <+25>: movl %eax, -0x10(%ebp) 
    0x6028c <+28>: calll 0x7c9ec     ; symbol stub for: objc_retain 
    0x60291 <+33>: movl -0x10(%ebp), %ecx 
    0x60294 <+36>: movl %ecx, (%esp) 
    0x60297 <+39>: movl %eax, -0x14(%ebp) 
    0x6029a <+42>: calll 0x7c9ec     ; symbol stub for: objc_retain 
>> 0x6029f <+47>: movl -0xc(%ebp), %ecx << CRASH HAPPENS WITH THIS LINE HIGHLIGHTED 
    0x602a2 <+50>: movl %ecx, (%esp) 
    0x602a5 <+53>: movl %eax, -0x18(%ebp) 
    0x602a8 <+56>: calll 0x7c9ec     ; symbol stub for: objc_retain 
    0x602ad <+61>: movl -0x8(%ebp), %ecx 
    0x602b0 <+64>: movl %ecx, (%esp) 
    0x602b3 <+67>: movl -0x10(%ebp), %edx 
    0x602b6 <+70>: movl %edx, 0x4(%esp) 
    0x602ba <+74>: movl -0xc(%ebp), %esi 
    0x602bd <+77>: movl %esi, 0x8(%esp) 
    0x602c1 <+81>: movl %eax, -0x1c(%ebp) 
    0x602c4 <+84>: calll 0x5fd40     ; Tikkun_Sample.TikkunRowView.onLongPress (sender : __ObjC.UILongPressGestureRecognizer, forEvent : __ObjC.UIEvent) ->() at TikkunRowView.swift:128 
    0x602c9 <+89>: movl -0xc(%ebp), %eax 
    0x602cc <+92>: movl %eax, (%esp) 
    0x602cf <+95>: calll 0x7c9e6     ; symbol stub for: objc_release 
    0x602d4 <+100>: addl $0x24, %esp 
    0x602d7 <+103>: popl %esi 
    0x602d8 <+104>: popl %ebp 
    0x602d9 <+105>: retl 

我在讀這東西不是專家,但它看起來像飛機墜毀在一個應該分派給我的事件處理程序方法編譯器生成的代碼發生。我不知道此代碼在調用我的代碼之前檢查的對象是什麼(在偏移量< + 84 >)。這裏是我用來構造手勢識別器的代碼:

let g = UILongPressGestureRecognizer(target: self, action: #selector(TikkunRowView.onLongPress(sender:forEvent:))) 
+0

'第1步:確定導致崩潰的行:'如果這在模擬器崩潰,那麼執行應停止在導致錯誤的行。如果不是,請添加一個異常斷點。請添加適當的代碼,指示哪一行執行停止。 '第2步:讓人們檢查崩潰日誌:'請添加一個相關的符號化崩潰日誌。 –

+0

檢查終端。任何東西都輸出到那裏?通常會有錯誤信息。而且,隱含地解開swift可選是大多數此類問題的原因。 –

+0

@RoboticCat - XCode停止在我的應用程序委託的類聲明中,而不是在任何可執行代碼中。控制檯中沒有崩潰日誌。 –

回答

1

我不知道爲什麼控制檯沒有給你任何細節錯誤信息。 (它應該!)但看着你的代碼,這顯然是由於手勢動作回調的錯誤簽名。以下是從api文檔引用的。

調用必須符合下列簽名之一所述的操作方法:
- (無效)handleGesture;
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;