定位野指針除了使用Malloc Scribble(內存塗鴉)外,還可以使用僵屍對象。所謂的僵屍對象,就是將被釋放的對象標記為僵屍,系統不會回收這些對象的內存,並讓這些內存無法被重用,因而也就不會被覆寫。
在啟用“僵屍對象”后,在調試期間,如果對象被釋放了,會被轉化為“僵屍對象”。如果再向對象發送消息,則對應的“僵屍對象”會收到這個消息,並拋出異常。異常信息中會明確描述被釋放的對象,以及接收的是哪個消息。
要開啟僵屍對象,可以勾選“Edit scheme” -> "Diagnotics" -> “Enable Zombie Objects”,如圖1所示。
我們通過一個簡單的例子來對比一下開啟僵屍對象前后程序的行為。代碼如下所示,我們將array聲明為一個__unsafe_unretained指針,其在賦值后會被立即釋放,且不會被置為nil。
__unsafe_unretained NSMutableArray *arrayM = [[NSMutableArray alloc] init]; [arrayM addObject:@"1"]; [arrayM addObject:@"2"]; NSLog(@"=%@",arrayM);
在未開啟僵屍對象的情況下,程序能正常運行,並打印出數組。而如果開啟了僵屍對象,則程序會崩潰,異常信息如圖2所示。