message sent to deallocated instance


在XCode的以前版本中,如果遇到了

[代碼]c#/cpp/oc代碼:

1 message sent to deallocated instance 0x6d564f0
我們可以使用info malloc-history 0x6d564f0來查看調用堆棧來查看崩潰發生的地方,這種方法這里不作闡述,大家自行百度。
 
在新的XCode里,調試器默認使用LLDB,我就講一下如何在LLDB狀態下定位到由於內存操作不當引起的Crash
首先我有一段會發生崩潰的代碼:

[代碼]c#/cpp/oc代碼:

1 NSString *themePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePathTmp];
2 if(themePath)
3   self.backgroundIV.image = [UIImage imageWithContentsOfFile:[themePath stringByAppendingPathComponent:@"mask_1.png"]];
4    
5 [themePath release];
學過內存管理的人都應該知道在這里themePath並沒有被retain,所以如果寫了release,那么必然會發生崩潰情況。首先我們需要對開發的環境變量進行設置
 
運行代碼,出現下面的崩潰現象
 
下面我們打開“活動監視器”,找到我們對應的PID,我們的Target為HPThemeManager,只要找到HPThemeManager對應的PID就可以(HPThemeManager是在論壇里下載的,本來正在看代碼,就直接拿他來作試驗了)
 
現在,我們得到了兩個主要的信息:
進程ID:50127
崩潰地址:0x6d564f0

我們打開終端,輸入以下命令:

[代碼]c#/cpp/oc代碼:

1 sudo malloc_history 50127 0x6d564f0

結果顯示為:

 
這樣我們用能定位到這行代碼

[代碼]c#/cpp/oc代碼:

1 NSString *themePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePathTmp];

對themePath進行排查,就找到了崩潰的罪魁禍首

[代碼]c#/cpp/oc代碼:

 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM