記憶體流失是當一個對象或變數在使用完成後沒有釋放掉,那麼如果我們走了另外一個極端情況會什麼樣呢?這就導致過渡釋放(over release)問題,從而使對象“殭屍化”,對象稱為殭屍(zombies)對象。一個對象已經被釋放過了,或者調用者沒有這個對象的所有權而釋放它, 都會造成過渡釋放,產生殭屍對象。
殭屍對象或許對很多人聽起來很恐怖、也很陌生,如果要說起EXEC_BAD_ACCESS異常,可能大家並不陌生。試圖調用殭屍對象方法應用會崩潰(應用直接跳出),並拋出異常EXEC_BAD_ACCESS。
我們看看代碼ViewController的程式碼片段:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSUInteger row = [indexPath row]; NSDictionary *rowDict = [self.listTeams objectAtIndex:row]; NSString *rowValue = [rowDict objectForKey:@"name"]; NSString *message = [[NSString alloc] initWithFormat:@”您選擇了%@隊。”, rowValue]; UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@”請選擇球隊” message:message delegate:self cancelButtonTitle:@”Ok” otherButtonTitles:nil]; [alert release]; ① [message release]; [alert show]; ② [tableView deselectRowAtIndexPath:indexPath animated:YES]; }
注意看程式碼的黑體部分,你會發現什麼問題嗎?程式啟動並執行結果拋出EXEC_BAD_ACCESS異常。假設我們現在無法找到問題,可以使用 Instruments工具的Zombies跟蹤模板。其中Instruments選擇Zombies模板,點擊Profile按鈕就可以進入了。