在寫obj-c**的時候,殭屍物件是比較麻煩的問題.殭屍物件是指,提前釋放記憶體的物件.對於iphone/mac程式來說,出現這個問題的原因一般有 2個,第一,程式設計師自己過早釋放記憶體,第二,使用了外部框架導致的.第一點很容易查出來,第二點來說,主要是因為外部框架一般會使用 autorelease,如果對框架怎麼執行不清楚的話,提前手動釋放記憶體,就會使自動釋放記憶體的時候出錯.
舉例來說:
nsautoreleasepool* pool = [[nsautoreleasepool alloc] init];由於nsdata的datawithbytes是類方法,並且會設定autorelease,所以在pool釋放記憶體的時候,data已經是殭屍物件.nsdata* data = [nsdata datawithbytes:"asklaskdxjgr" length:12];
[data release];
[pool release];
解決方法來說一般也是2個,第乙個所有物件都使用autorelease方式,但是這種方式的問題在於performance不怎麼好,而且也不利於程式設計師水平的提高.第二個就是找到殭屍物件,檢視其呼叫關係,理順記憶體釋放順序.那麼找到殭屍物件就成為了急需解決的問題.
蘋果有個頭檔案,叫nsdebug.h,具體在
這裡. 很久以前就是靠引入這個標頭檔案來解決問題.當然隨著obj-c 2.0的引入,我們可以不再用這麼古老的方式.新的做法如下:
1 在xode裡右擊可執行檔案,選擇get info-->arguments-->variables to be set in the env
2 新增以下變數
nsdebugenablednszombieenabled
mallocstacklogging
mallocstackloggingnocompact
?設定他們的值為yes.
3 在debug模式下執行程式,到pool release的時候,會在console上看到:
2010-12-25 08:01:38.644 autoreleasebug[3939] *** *** selector 'release'
sent to dealloced instance 0xa4e10 of class nsconcretedata.
這就說明有殭屍物件出現,給了程序id--3939,物件記憶體位址--0xa4e10.
4 接下來在console裡敲shell malloc_history pid(3939) address(0xa4e10).得到呼叫關係如下:
| -[nscontrol mousedown:] | -[nsbuttoncell trackmouse:inrect:ofview:untilmouseup:]
| -[nscell trackmouse:inrect:ofview:untilmouseup:] | -[nscell _sendactionfrom:]
untildate:inmode:dequeue:] | _dpsnextevent | blockuntilnexteventmatchinglistinmode
| receivenexteventcommon | runcurrenteventloopinmode | cfrunlooprunspecific
| __cfrunlooprun | __cfrunloopdoobservers | _handlewindowneedsdisplay | -[nswindow
displayifneeded] | -[nsview displayifneeded] | -[nsview _displayrectignoringopacity:
isvisiblerect:rectisvisiblerectforview:] | -[nsthemeframe
_recursivedisplayrectifneededignoringopacity:isvisiblerect:rectisvisiblerectforview:
topview:] | -[nsframeview _recursivedisplayrectifneededignoringopacity:isvisiblerect:
rectisvisiblerectforview:topview:] | -[nsview _recursivedisplayrectifneededignoringopacity:
isvisiblerect:rectisvisiblerectforview:topview:] | -[nsview
_recursivedisplayrectifneededignoringopacity:isvisiblerect:rectisvisiblerectforview:topview:]
| -[nsview(nsinternal) _getdirtyrects:clippedtorect:count:boundingbox:] | -[nsregion
mutablecopy] | nsallocateobject | _internal_class_createinstancefromzone | malloc_zone_ca
lloc
根據這個呼叫關係,我們就可以哪個物件被提前釋放了,從而修改程式.
iOS 殭屍物件除錯
近來,發現xcode的模擬器越來越不靠不住了,應用開發完,在模擬器上面各種流暢各種執行得飛起,但是安裝到真機之後,就崩潰了,是閃退啊!o 為了迅速定位並解決問題,最終還是選擇了方法三,並且最終解決了問題。從xcode7之後,真機除錯已經是沒有任何門檻了,我們只需要註冊乙個蘋果的開發者賬號即可以無證書...
Xcode使用技巧 Xcode除錯方法
這裡記錄一下自己學習到的一些xcode除錯的方法。這些除錯方法可以讓我們使用xcode編寫 進行除錯時用起來更順心應手。xcode的除錯方法包括執行時設定斷點,列印到控制台,手寫命令列印等。在xcode中需要觀察的變數所在的 處新增斷點,可以讓程式執行到這裡暫停。這時滑鼠懸停在變數名處,xcode會...
xcode除錯技巧
有時程式崩潰根本不知錯誤發生在什麼地方。比如程式出現exec bad access的時候,雖然大部分情況使用設定nszombieenabled環境變數可以幫助你找到問題的所在,但少數情況下,即使設定了nszombieenabled環境變數,還是不知道程式崩潰在什麼地方。那麼就需要使用下列 進行幫助了...