生活随笔
收集整理的這篇文章主要介紹了
关于内存管理-提前释放的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近接受了一個項目,代碼構造是很好的,但是還是使用mrc的管理方法,這次又算讓我學習了一次內存管理,遇到內存釋放crash的問題,搜了一篇文章,不妨使用下面的方法,可以有一個很好地定位。
在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]; |
| 3 | ??self.backgroundIV.image = [UIImage imageWithContentsOfFile:[themePath stringByAppendingPathComponent:@"mask_1.png"]]; |
學過內存管理的人都應該知道在這里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代碼:
?原文地址:http://www.devdiv.com/lldb_message_sent_to_deallocated_instance_-blog-50901-50856.html 分類:?objective-c
轉載于:https://www.cnblogs.com/lixiong-iOS/p/4446676.html
總結
以上是生活随笔為你收集整理的关于内存管理-提前释放的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。