簡體   English   中英

ios 崩潰 EXC_BAD_ACCESS KERN_INVALID_ADDRESS

[英]ios crash EXC_BAD_ACCESS KERN_INVALID_ADDRESS

MyApp 98% 的時間運行良好,但有時會崩潰。 太隨意了

崩潰報告顯示以下內容。

Thread : Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x3b1ae626 objc_msgSend + 5
1  Foundation                     0x310e2381 _netServiceMonitorCallBack + 104
2  CFNetwork                      0x302ea3b5 _QueryRecordReply(_DNSServiceRef_t*, unsigned int, unsigned int, int, char const*, unsigned short, unsigned short, unsigned short, void const*, unsigned int, void*) + 324
3  libsystem_dnssd.dylib          0x3b7289d9 handle_query_response + 168
4  libsystem_dnssd.dylib          0x3b72773f DNSServiceProcessResult + 582
5  CFNetwork                      0x302ea3e5 _SocketCallBack_Mon(__CFSocket*, unsigned long, __CFData const*, void const*, void*) + 20
6  CoreFoundation                 0x30691189 __CFSocketPerformV0 + 580
7  CoreFoundation                 0x3068efaf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
8  CoreFoundation                 0x3068e477 __CFRunLoopDoSources0 + 206
9  CoreFoundation                 0x3068cc67 __CFRunLoopRun + 630
10 CoreFoundation                 0x305f7729 CFRunLoopRunSpecific + 524
11 CoreFoundation                 0x305f750b CFRunLoopRunInMode + 106
12 GraphicsServices               0x355336d3 GSEventRunModal + 138
13 UIKit                          0x32f58871 UIApplicationMain + 1136
14 MyApp                          0x0013f813 main (main.m:16)

所有這些看起來都像是內部方法。 我在運行 iOS 7.1.2 的 iPad 4 上遇到這些崩潰。 我怎樣才能把它釘牢? 感謝所有幫助。

發生此崩潰是由於懸空指針。 當任何變量或對象試圖訪問一個已經被釋放的對象時,就會發生這種崩潰。

這是一個老問題,但 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 崩潰不是由於內存泄漏,而是由於嘗試訪問已釋放的對象。 因為釋放對象的內存現在可能被另一個不同類型的對象占用,崩潰堆棧中的最后一行可能會誤導,因為它不是你編程執行路徑的真正一部分,所以通常我們需要查找跟蹤一點點。 然而,@Sj 發布的堆棧跟蹤基本上只包含系統調用,所以這真的很難。 如果這是在調試會話中生成的,添加“所有異常”斷點可能有助於生成信息更豐富的堆棧跟蹤。

EXC_BAD_ACCESS KERN_INVALID_ADDRESS 崩潰不是由於內存泄漏,而是由於嘗試訪問已釋放的對象。

示例:如果您使用__weak typeof(self) weakSelf = self; 並且對象在您在塊內訪問它之前已被釋放,您將遇到崩潰。 原因——訪問錯誤的內存地址,因為對象被釋放。

為了防止這種情況使用__strong typeof(self) strongSelf = self; 塊內。 Nil值將被正確處理而不會崩潰


注意:使用此代碼示例進行快速工作。

#define weakify(var) __weak typeof(var) AHKWeak_##var = var;

#define strongify(var) \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wshadow\"") \
__strong typeof(var) var = AHKWeak_##var; \
_Pragma("clang diagnostic pop")

用法示例:

weakify(self); // Remove retain cycle
[self someFunctionWithBlock:^{
    strongify(self); // Make reference to address valid

}];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM