2010-10-27 77 views
0

我收到以下代碼的錯誤消息。本質上,應用程序確認在從表格視圖中選擇時調用該號碼。當具有此警報的ViewContoller被取消時,EXC_BAD_ACCESS即將進入。UIAlertView正在導致EXC_BAD_ACCESS

只有在警報被觸發時纔會發生。如果僅在沒有選擇的情況下查看錶格,則不會發生。這告訴我,我正在做這個UIAlertView錯誤。可能與內存管理有關併發布我不應該做的事情。

我哪裏錯了?

phoneAlert = [[[UIAlertView alloc] initWithTitle:locationName message:displayNumber delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call",nil] autorelease]; 
    [phoneAlert show]; 
[tableView deselectRowAtIndexPath:indexPath animated:YES]; 


- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 1) { 
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@",dialNumber]]];  
    } 

} 

- (void)dealloc { 
    [locations release]; 
    [location release]; 
    [dialNumber release]; 
    [phoneAlert release]; 
     [super dealloc]; 
} 
+0

重複的問題:http://support.microsoft.com/kb/4212580/uialertview-exits-exc-bad-access-error/20058822#20058822 – 2013-11-18 22:06:06

回答

3

您分配phoneAlert自動釋放UIAlertView,這是不,因爲你不使用點語法或setter方法由您的實例保留,你在做直分配。

所以,如果你定義phoneAlert爲與retain關鍵字的屬性,那麼你應該這樣做是爲了得到期望的結果:

self.phoneAlert = ... 

[self setPhoneAlert:...]; 

否則,你會得到EXC_BAD_ACCESS您的dealloc方法,因爲您autorelease d警報視圖,因此該實例被autorelease池釋放。打開項目中的殭屍,看看這個行動。

+0

對,感謝您的幫助。我真的回去了,意識到我正在讓它變得比它真正需要的複雜。特別是只是一個確認消息。我應該更頻繁地這樣做。 – TheHockeyGeek 2010-10-27 15:55:18