![](/img/trans.png)
[英]Why should a self-implemented getter retain and autorelease the returned object?
[英][self retain], [self autorelease], is this correct when I'm assigned as a delegate?
我用一些聽起來很奇怪的東西解決了崩潰:調用[self retain]和[self autorelease]。
這是案例:
MyObject是UIView的子類,因此通常將其分配,放在視圖堆棧上並釋放。 MyObject還有一個計時器,它將自己從superview中刪除。 所以基本上MyObject可以隨時解除分配。 除了顯示酷的stuf之外,MyObject還能夠顯示UIAlertView,並等待用戶的選擇,因此它是alertView的委托。 問題是,如果用戶在MyObject被釋放后做出選擇......那么你知道EXC_BAD_ACCESS我猜...
所以我可以保留對AlertViews的引用(是的,有幾個),並在MyObject dealloc方法中將委托設置為nil。 但是我無法處理選擇(因為有幾個,它會產生更多變量實例,我不喜歡。
所以我做的是:
//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
}
我知道這不好,我已經圍繞這個做了很多評論,以使其他開發人員能夠重用代碼時要小心,但我看不到另一種選擇。 這是正確的嗎 ? 有更好的方法嗎?
請記住,委托模式,以避免具有循環依賴性,該循環依賴性阻止主對象以及委托被釋放,因為它們都具有彼此的引用,這要求主對象不保留委托。 因此,如果您動態創建委托並將其分配給對象,則必須自行保留並自動釋放!
坦率地說,你的程序結構都是粗糙的,這就是導致你麻煩的原因。 您應該將所有委托功能和管理視圖的責任移動到單獨的控制器對象中。
首先,我沒有看到保留自己的問題。 我也在一些多線程代碼中做過。 也許不是最好的解決方案,但它有效。
現在,如果你想避免[自我保留],請考慮以下事項:當計時器觸發時,可能不會直接解除分配,而是檢查是否存在警報。 如果沒有,請釋放。 如果是,則隱藏視圖(但不要從superview中刪除)並在新的ivar中設置一個標志,該對象應從superview中刪除。 在工作表的回調中,檢查標志,如果已設置,則從超視圖中刪除視圖,然后釋放它。
你不能讓你的alertView
成為alertView
或實例變量,只需在MyObject的dealloc
設置alertView.delegste = nil
嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.