2011-07-12 39 views
1

對代表感到困惑。我一直覺得,如果你沒有設置一個委託,而不會響應委託回調。我碰到一個釋放它的對象的Class方法。將Class方法與具有委託的對象混淆

可以說我有一個對象「某事」,它有一個委託設置,用於處理關心的調用者的結果。有些東西使用ASIHTTPRequest來做一些帖子/異步獲取。

-(void)somethingHasResults{ 

//something needs to tell its listeners that its has completed (pseudo-code) 

if([delegate respondsToSelector:@selector(somethingDidComplete)]){ 

    [delegate somethingDidComplete]; 

} 

} 

但我也有像這樣的一系列類方法Helpers.h/.M ...

+(void)shoutItOutLoud{ 

    //doesn't need a delegate, doesn't need a response -- just do your thing and exit 

    Something *something = [[Something alloc] init]; 

    [something shouldDoSomethingAwesomeButDoesntNeedToRespond]; 

    [something release]; 

} 

當我使用[助手shoutItOutLoud]我得到一個崩潰。現在崩潰實際上是在ASIHttpRequest.m的reportFinished中,但跟蹤將我帶回到我的類方法,該方法在完成之前釋放對象。

整個問題的關鍵在於,我很驚訝我在這裏發生了一次撞車事故,並且我正試圖圍繞這一點進行考慮。一位同事和我參加了一次討論,他說這是因爲我正在釋放我的對象,所以委託人指着垃圾。這對我來說似乎是錯誤的,因爲這個類方法不會收到響應呢?

+0

從崩潰的描述聽起來像你設置這個「東西」對象上的委託ASIHttpRequest。那是對的嗎?如果是這樣的話,那麼當請求仍然認爲「某事」是該請求的委託時,你正在銷燬那些東西。 –

+0

Arghh,因爲異步連接而輸入了全部內容......。 ASIHttpRequest在幾天前被其他人的NSURLConnection添加。 – warpedspeed

+0

這個問題不是100%清楚,但我認爲你的同事是正確的。你確定''shoutItOutLoud'裏面創建的'something'對象在'release'd後沒有被使用嗎?嘗試做'something = nil;'在'[釋放]之後'' – nacho4d

回答

1

我相信你的問題實際上是不清理ASIHttpRequest委託:ASIHttpRequest對象將其委託設置爲從中調用的對象。

所以你需要清除這個委託(在Something類中)。假設你有型ASIHttpRequest的屬性,這裏是我的dealloc方法做:

- (void)dealloc {

... 
[_request clearDelegatesAndCancel]; 
[_request release]; 
[super dealloc]; 

}