如果學會了如果委託的壽命比對象短,應該從對象中刪除委託的困難方式。但是如果你沒有對象的引用,你如何做到這一點?從未引用的對象上刪除dealloc上的委託
在我的iPhone應用程序中,我有一個視圖控制器vc
,它執行異步活動並顯示爲模態視圖。取消按鈕取消模態視圖。如果發生錯誤,則顯示UIAlertView alert
。如果用戶點擊確定,alert
和模態視圖都會消失。因此vc
被設置爲 作爲alert
的代表並且實施alertView:didDismissWithButtonIndex:
。例如:
// UIViewController vc
...
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Error"
message:@"Something went wrong"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
self.alertView = alert; // needed to unset alertView.delegate in dealloc
[alert show];
[alert release];
...
}
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
[self dismissModalViewControllerAnimated:YES];
}
}
通常,警報視圖會阻止所有輸入。不幸的是,它在某些邊緣情況下沒有這樣做。 如果用戶在警報視圖出現之前觸摸取消按鈕,並在出現警報視圖後觸摸,視圖將被取消,但不取消警報。 vc
被取消分配,並且如果用戶在警報上點擊「ok」,則應用程序崩潰,因爲消息已發送到已發佈的對象。
我通過將alert
分配給vc
屬性解決了這個問題,所以我可以設置alert.delegate
在dealloc中爲零。我覺得這個解決方案不是很優雅,因爲我不需要參考警報。
有沒有更好的方法?
編輯:添加在斜體爲澄清
我嘗試設置userInteractionEnabled = NO,但在取消按鈕的觸摸停止仍在處理。我可能不得不參考警報方式。 –