2011-08-04 32 views
0

我解決了一個聽起來很奇怪的事情:調用[self retain]和[self autorelease]。[self retain],[self autorelease],當我被分配爲代表時,這是否正確?

這裏的情況:

myObject的是一個UIView的一個子類,所以通常它的分配,把視圖堆棧,並釋放。 MyObject也有一個定時器,它將從超級視圖中刪除它自己。所以基本上MyObject可以隨時解除分配。 除了顯示很酷的stuf外,MyObject還能夠顯示UIAlertView,並等待用戶的選擇,因此它是alertView的委託。 的問題是,如果用戶進行MyObject的後一種選擇被釋放......那麼你知道EXC_BAD_ACCESS我猜...

這樣我就可以一直保持到AlertViews的引用(是的,有severals),和在MyObject dealloc方法中將委託設置爲零。但我無法處理的選擇,然後(並且有好幾種,它將使更多變的情況下,我不喜歡

所以我所做的是:

//alertView creation 
-(void)showAlert{ 
    [self retain]; 

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"title" 
    message:@"message" 
    delegate:self 
    cancelButtonTitle:@"No" 
    otherButtonTitles:@"Yes",nil]; 

    [alertView show]; 
    [alertView release]; 
} 

//Delegate method 
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    [self autorelease]; 
    // Do the job 
} 

我知道這是不是很好,我已經提出了許多意見,以使其他開發人員能夠重複使用代碼時要小心,但我看不到另一種選擇。是否有更好的方法來處理它?

回答

1

Keep in請注意委託模式,以避免出現循環依賴性,從而阻止主對象以及委託被釋放,因爲它們都具有對每個其他,要求主對象不保留委託人。因此,如果您即時創建委託並將其分配給對象,則必須自行保留並自動釋放它!

0

首先,我沒有看到保留自我的問題。我也在一些多線程代碼中完成了它。也許不是最好的解決方案,但它的工作。

現在,如果你想避免[自我保留],請考慮以下幾點: 也許不是在計時器觸發時直接解除分配,而是檢查是否存在警報。如果沒有,釋放。如果是的話,隱藏視圖(但不要從超級視圖中移除)並在新視圖中設置一個標誌,該對象應該從超級視圖中移除。在工作表的回調中,檢查標誌,如果設置,從超級視圖中刪除視圖,釋放它。

+0

我正在處理的對象是一個我們給予客戶的圖書館,所以它也可以從我們的客戶的超視圖中刪除。儘管這是一個好主意,但它會讓我們的客戶做到這一點太複雜。 – Julien

1

坦率地說,你的程序結構都是粗糙的,這就是你的問題所在。您應該將所有委託功能和管理視圖的責任移到單獨的控制器對象中。

0

難道你不能讓你的alertView @property或實例變量,只是在MyObject的dealloc中設置alertView.delegste = nil

+0

我可以,但後來我無法處理用戶選擇的信息 – Julien

相關問題