2017-08-27 10 views
1

私はARCなしでやるべきことがあります。以前は使っていませんでした(最近、iosの開発を始めました)。 HTTP要求を表すクラスがあり、NSURLSessionDownloadDelegateプロトコルに準拠しています。また、私は次のコードを持っています:デリゲートを使用してオブジェクトを解放する必要がありますか?

-(void)executeWithRelativeUrl:(NSString *)relativeUrl andSuccessBlock: (void(^) (NSData*))successBlock { 
    NSURL *url = [[NSURL alloc] initWithString:relativeUrl relativeToURL:self.baseUrl]; 
    [self setSuccessBlock:successBlock]; 
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 
    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil]; 
    NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request]; 
    [downloadTask resume]; 

    [request release]; 
    [url release]; 
} 

URLセッションを作成し、ダウンロードタスクを開始します。私は、以下の方法でタスクの結果を扱っています:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { 
    NSData *data = [NSData dataWithContentsOfURL:location]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.successBlock(data); 
    }); 

} 

今の質問:私は最後のメソッドの最後にセッション、ダウンロードタスクと場所のURLを解放する必要がありますか?それとも私のためにされますか?私は最初の方法(URLを除いて)で作成したので、これを求めています。オブジェクトを解放する責任がある人も私です。ありがとう!

+0

あなたがそれを必要とするなら、あなたはそれをキャンセルすることができるようにそれを参照することもできます。 –

答えて

0

Golden Ruleは非常に簡単です。 allocまたはcopyまたはretainと言っていますか?いいえ?そうすれば、releaseと言う必要はありません(そうしてはいけません)。

(あなたがその理由でurlrequestを解放する必要がある、とあなたがそうしている。メモリ管理が完了しましたので。)あなたがプロパティとしてまたは配列にdownloadTaskを持っている場合、それは良いです

+0

私はセッションとダウンロードタスクを割り当てる最初の方法でそれを言った。または、2番目のメソッドのオブジェクトが同じではありませんか? – Yuuji

+0

セッションとダウンロードタスクを「割り当てる」コードは表示されませんでした。それでは、あなたは何について話していますか? – matt

+0

ああ...私は明示的な 'init'でそれらを得ていません。今、私は分かる。答えてくれてありがとう! – Yuuji

関連する問題