2012-02-03 15 views
1

私はネットワークリクエストを中心に構築されたラッパークラスを持っています。 これを 'WrapperNetworkRequest'と呼ぶことができます完了前にObj-C自動解放ネットワークリクエストが解放されました

私はそれを返すとJSON応答を処理するため、それをラップする理由があります。 次に、 'WrapperNetworkRequestDelegate'プロトコルを使用して、代理人に応答を返します。

「WrapperNetworkRequest」クラスを自動リリースオブジェクトとして使用すると、ネットワーク要求が完了する前に自動的に解放されるという問題があります。

は私が恐ろしいアイデア

これを処理する適切な方法は何か上の任意のアイデアを/私は何をしています(適切な時間に+ [セルフリリース] [自己保持]を)と思われるものを思い付きました違う? ありがとう

+0

まず、@shoが良い解決策を提供します。これが、通常、最良の方法です。第二に、 '[自己保持]'には長い歴史があります。 D(私はそれを何度も見て、それを数回使ったと言っているだけです)第3に、MKNetworkKitのようなフレームワークを検討したいと思うかもしれません。この問題(および関連する問題)を処理するように設計されており、自動的にキューを管理します。インスピレーションのためにコネクションがどのように生かされているかを見ることもできます。 https://github.com/MugunthKumar/MKNetworkKit –

答えて

0

selfを保持するには、完全に正気のアイデアです。どのように正確に行うかは別の問題です:[self retain]を実行するか、指定された種類のすべてのオブジェクトを保持する共有保持配列にselfを追加できます。考えてくださいNSOperationQueue。キューに操作オブジェクトを追加した後は、その操作の所有権をキューに追加してキューに追加することで、その操作を安全に解放できます。

+0

@shoは私の問題を部分的に解決する答えを提供しましたが、これは私のニーズの解決策であるようです。あなたの答えを読んでいくつかの調査をした後、NSURLConnectionの例として、実行ループにaddというものがあることを示唆する文献があります。これにより、ラッパークラスをローカル変数として使用したいクラス内でより大きな柔軟性が得られます。ラッパークラスを持つことで、ラッパーが終了するまで所有権を持つ共有インスタンスに自分自身を追加して、自分の状況に合ったものに見えます。助けてくれてありがとう – SRandazzo

2

WrapperNetworkRequestNSURLConnectionDelegate実装方法に保持する代わりに、代理人に所有権を委譲させてください。これを行うための1つの可能な方法:あなたがオブジェクトの生存期間を延長する必要がある場合

@interface Foo : NSObject <WrapperNetworkRequestDelegate> 
@property (nonatomic, retain) WrapperNetworkRequest * wrappedRequest; 

@end 

@implementation Foo 
@synthesize wrappedRequest; 

//.... 

- (void)bar 
{ 
    WrapperNetworkRequest * request = [WrapperNetworkRequest aNewAutoreleasedRequest]; 
    request.delegate = self; 
    self.wrappedRequest = request; // Foo instance assumes ownership 

    [request goGetData]; 
} 

//.... 

@end 
+0

ありがとうございます。私はこのアプローチを考えましたが、もし私がこのラッパークラスを友人に与えるなら、どうしたらいいでしょうか?応答を得るための唯一の保証された_italic_方法がそれを保持することであることを彼らに伝えなければならないか? – SRandazzo

+0

私はこの同じ問題に苦しんでおり、私の解決策はここと同じです。つまり、呼び出し元として、オブジェクトが周りに残っていることを確認する必要があります。あなたがそれについて考えるなら、それは意味をなさない。要求を使用しているオブジェクトがそれを所有していない場合、どのようにしてそれから何かを得ることができることを保証できますか? – mattjgalloway

+0

何かが応答を処理する必要があります。ハンドラ(すなわちデリゲート)が要求の所有権を受け入れる(すなわち、保持する)ことが適切であると思われる。 – sho

関連する問題