2011-07-12 10 views
1

デリゲートに混乱します。私は、デリゲートを設定しなかった場合、デリゲートコールバックに応答しない場合があるという印象を常に受け​​ていました。オブジェクトを解放するClassメソッドでクラッシュしました。デリゲートを持つオブジェクトでClassメソッドを使用すると混乱します

私はオブジェクト "Something"を持っています。このオブジェクトには、気になる発信者に結果を処理するための代理人セットアップがあります。何かが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]; 

}

関連する問題