私のメモリ管理とスレッド化の知識は非常に限られているので、本当に基本的なものが欠けている可能性があります。この問題の回避策を見つけましたが、何が起こっているのかわからないのが本当に気になります。
2つの非同期HTTPリクエストを作成するクラスがあります。1つはXML構成ファイル用で、もう1つは画像用です。同じクラスで2つの非同期リクエストが実行されているため、同じNSURLConnectionDelegate
メソッドを再利用しています(おそらく要因)。まず、構成ファイルを非同期でフェッチし、ととして保存されている2つのURLを抽出しsponsorImage
ますsponsorUrl
。次に、の値を使用してsponsorImage
画像データを非同期にフェッチします。sponsorUrl
ただし、イメージを取得した後(2番目の非同期イベントが完了した後)にリリースされていることがわかりました。
sponsorUrl
画像リクエストを作成する方法で「何かをする」と、解放されないようにすることができることに偶然気づきました。「何かをする」とは、まさにそれを意味します。基本的に、私のコードは次のようになります。
- (void) loadImage
{
sponsorUrl = [sponsorUrl stringByAppendingString:@""];
NSURL *url = [NSURL URLWithString:sponsorImage];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:dateString forHTTPHeaderField:@"If-Modified-Since"];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
[connection release];
}
このメソッドの最初の行(URLに「」を追加しているところ)を削除すると、変数は保持されます。削除すると解放されます。これは私にはまったく意味がありません。
で宣言sponsorUrl
してみました@propterty (nonatomic, retain)
; sponsorUrl
静的に宣言してみました。設定した場所に追加してみまし[sponsorUrl retain]
たが、違いはありません。動作する唯一のことは、2番目の要求を行う前に変数に「触れる」ことです。
私は何が欠けていますか?