對代表感到困惑。我一直覺得,如果你沒有設置一個委託,而不會響應委託回調。我碰到一個釋放它的對象的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中,但跟蹤將我帶回到我的類方法,該方法在完成之前釋放對象。
整個問題的關鍵在於,我很驚訝我在這裏發生了一次撞車事故,並且我正試圖圍繞這一點進行考慮。一位同事和我參加了一次討論,他說這是因爲我正在釋放我的對象,所以委託人指着垃圾。這對我來說似乎是錯誤的,因爲這個類方法不會收到響應呢?
從崩潰的描述聽起來像你設置這個「東西」對象上的委託ASIHttpRequest。那是對的嗎?如果是這樣的話,那麼當請求仍然認爲「某事」是該請求的委託時,你正在銷燬那些東西。 –
Arghh,因爲異步連接而輸入了全部內容......。 ASIHttpRequest在幾天前被其他人的NSURLConnection添加。 – warpedspeed
這個問題不是100%清楚,但我認爲你的同事是正確的。你確定''shoutItOutLoud'裏面創建的'something'對象在'release'd後沒有被使用嗎?嘗試做'something = nil;'在'[釋放]之後'' – nacho4d