0

バックグラウンドスレッドで画像をチャンクごとにアップロードしています。各チャンクのサイズは512kbです。私の知る限りでは、リリースnsautoreleasepoolを使用してメモリリークを処理しました。以下は、画像をチャンク単位でアップロードするためのコードです。

- (void)FetchDataFromDB : (NSNumber *) isOffline
{
 @autoreleasepool {
    @try {
    NSLog(@"FetchDatafromDB");
    isThreadStarted = YES;

    VYukaDBFunctions *vdb = [VYukaDBFunctions getInstance];

    NSMutableArray *fileNames = [vdb GetFileNames:[isOffline integerValue]];
    for(int j=0 ; j<[fileNames count] ; j++)
    {

        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        NSString * filename = fileNames [j] ;
        int _outgoingMsgId = [[vdb SelectMsgId:filename] intValue];
        int  _totalchunk =[[vdb SelectTotalChunk:filename]intValue];
        int currentChunk = [vdb GetCurrentChunk:filename];
    for( int i=currentChunk ; i <= _totalchunk ; i++)
    {

        NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init];

        NSString *AsyncRequest = [[NSString alloc] init];
        AsyncRequest = [vdb SelectAsyncRequest: i : _outgoingMsgId];

        if(![AsyncRequest isEqual:@""])
        {

        BOOL status = [self UploadChunkWise :AsyncRequest : 1 : i : vdb : filename : _outgoingMsgId];
      // AsyncRequest = NULL;
     //  [AsyncRequest release];
        if(status){
            if(i==_totalchunk)
            {
                NSLog(@"Deleting from medialist , FileName :%@", filename);
                [vdb DeleteFromMediaList : filename];

            }
        }
        else{

            [vdb DeleteFromMediaList : filename];
            break;
        }
        }

        [innerPool drain];
    }

        [pool drain];
    }

    [fileNames removeAllObjects];

   // [fileNames release];

    //recurssive call to check any pending uploads..
    if([[vdb GetFileNames:[isOffline integerValue]] count] > 0)
    {
        NSLog(@"Calling Recursively..");
        [self FetchDataFromDB:[isOffline integerValue]];
    }

    }
    @catch (NSException *exception) {

        NSLog(@"Exception caught on Uploading from FetchDataFromDB:%@", exception);

    }
    @finally {

    }
}

 NSLog(@"thread quit ");
 isThreadStarted = NO;
[NSThread exit];

}

-(BOOL) UploadChunkWise :(NSString *) AsyncRequest : (int) count : (int)currentChunk : (VYukaDBFunctions * ) vdb : (NSString *) currentFileName : (int) outgoingMsgId
{

NSHTTPURLResponse *response ;
NSError *error;
//Yes, http
NSMutableURLRequest *httpRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL     URLWithString:@"Url goes here"]];
NSData* data = [AsyncRequest dataUsingEncoding:NSUTF8StringEncoding];

[httpRequest setHTTPMethod:@"POST"];
[httpRequest setHTTPBody:data];

[httpRequest setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"];
NSData *returnedData = [NSURLConnection sendSynchronousRequest: httpRequest returningResponse:&response error:&error] ;
NSString *result= [[NSString alloc] initWithData:returnedData encoding:NSASCIIStringEncoding];
[httpRequest release];

returnedData= NULL;
[returnedData release];
data = NULL;
[data release];

if ([result rangeOfString:@"success"].location != NSNotFound )
{
    NSLog(@" success");
    [vdb DeleteCurrentChunkFromOutgoingTable:currentChunk : outgoingMsgId];
    [result release];
    return YES ;

}
else if ([result rangeOfString:@"fail"].location != NSNotFound )
{
    [result release];
    if (count < 3) {

        return  [self UploadChunkWise :AsyncRequest : count+1 : currentChunk: vdb : currentFileName : outgoingMsgId ];
    }
    else
    {
        NSLog(@" failed");
        [vdb DeleteAllCurrentFileChunksFromOutgoingTable:currentFileName];
        return NO ;
    }

}

return NO;

}

私は以下のようにスレッドを開始しています

 [NSThread detachNewThreadSelector:@selector(FetchDataFromDB:) toTarget:self withObject:[NSNumber numberWithInt:0]];

問題は、9 ~ 12 個のチャンクをアップロードした後、メモリ エラーが発生することです。メモリ警告が 4 ~ 5 回発生し、その後アプリがクラッシュします。コンソールでは、最初にアプリ デリゲート クラスでメモリ警告が発生し、続いて UIViewController を拡張する 4 つのクラスが発生します。アプリ デリゲートや、UIViewController 型の他のクラスで警告が表示されるのはなぜですか。別のスレッドでメモリ エラーが発生している場合、他のクラスのオブジェクトを解放する必要があるのはなぜですか? 私はここで何を間違っていますか?ARCを使用していない古いコードとこれを統合したため、ARCを使用できません。ARCクラスを有効にしようとしましたが、動作しません。このコードにメモリリークがあるかどうかを調べるのを手伝ってくれる人はいますか? 提案を歓迎し、感謝します。よろしくお願いします..

4

1 に答える 1