0

毎回、次のメソッドを呼び出して、約 2Mb のデータのスライスをアップロードします。

約 30 回呼び出した後、アプリはメモリ警告を受け取り、約 20 回以上呼び出した後、アプリは情報なしでクラッシュします。私のコードに何か問題がありますか? コードにメモリ リークは見つかりませんでした。

//connect to uploading server, upload one slice of data, and get the next slice uploading point.
-(void)uploadSlice
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSURL *baseUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@/gupload/upload_slice",_uploadServerIP]];
    NSData *sliceData = nil;  
    NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:item.filePath];  
    if (file == nil)  
        NSLog(@"Failed to open file");  

    [file seekToFileOffset:_offset];  
    sliceData = [file readDataOfLength:_length];  
    [file closeFile];
    NSMutableData *data = [NSMutableData dataWithData:sliceData];
    NSDictionary *dic    = [[NSDictionary alloc]initWithObjectsAndKeys:
                            _uploadToken,                                  @"upload_token",
                            [NSString stringWithFormat:@"%d",_sliceTaskId],@"slice_task_id",
                            [NSString stringWithFormat:@"%lld",_offset],   @"offset",
                            [NSString stringWithFormat:@"%d",_length],     @"length",
                            nil];

    NSURL *finalUrl = [self generateURL:[baseUrl absoluteString] params:dic];
    NSLog(@"upload slice url = %@",finalUrl);
    ASIFormDataRequest *aRequest = [ASIFormDataRequest requestWithURL:finalUrl];
    [aRequest setPostBody:data];

    aRequest.requestMethod = @"POST";
    [self setPostUserInfo:aRequest withRequestType:kYoukuUploadSlice];
    [_networkQueue addOperation:aRequest];

    [dic release];
    [pool drain];
}
4

1 に答える 1

2

一度にキューに入れるリクエストが多すぎます-ASIHTTPRequestは、サーバーに送信されるまでデータをメモリに保持するため、メモリが不足するのは当然のことです。

キューに未処理のリクエストが3つまたは4つを超えないようにしてください。最初に4をキューに入れ、1つが終了したら、もう1つをキューに入れます。

于 2012-06-18T02:13:18.863 に答える