-1

Edit-Refactor->Convert to ARC を使用して、非 ARC プロジェクトを ARC に変更しました。この方法で呼び出される関数を除いて、すべてのリークがなくなりました。

NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                        initWithTarget:self
                                        selector:@selector(DownloadAll)
                                        object:nil];
    operation.queuePriority=NSOperationQueuePriorityVeryHigh;
    [queue addOperation:operation];

そしてここに関数があります:

-(void)DownloadAll{
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath;
bool fileExists;
NSString * strSelect = [NSString stringWithFormat:@"SELECT NoOfAyas from tbSura"];
NSMutableArray * marrItems = [gObj.sqlObj selStatement:strSelect :1];
for (int i =1; i<=114; i++) {
    documentsPath = [NSString stringWithFormat:@"%@/%@/%i",[paths objectAtIndex:0],DefaultReader,i];
    fileExists = [[NSFileManager defaultManager] fileExistsAtPath:documentsPath];
    if (!fileExists)
        [[NSFileManager defaultManager] createDirectoryAtPath:documentsPath withIntermediateDirectories:YES attributes:nil error:nil];

    for (int j =1; j<=[[marrItems objectAtIndex:i-1] intValue]; j++) {
        int indx=[ReadersIDs indexOfObject:DefaultReader];
        NSString *str=[NSString stringWithFormat:@"%@%i/%i.mp3",[ReadersPaths objectAtIndex:indx],i,j];

        documentsPath = [NSString stringWithFormat:@"%@/%@/%i/%@",[paths objectAtIndex:0],DefaultReader,i,[str lastPathComponent]];

        fileExists = [[NSFileManager defaultManager] fileExistsAtPath:documentsPath];
        if (!fileExists) {
            @autoreleasepool {
                NSError *err;
                NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:str] options:0 error:nil];

                if (err) {
                    NSLog(@"%@",err);
                }

                if(!data)
                    NSLog(@"Aya : %i  %i",i,j);
                else
                    [data writeToFile:documentsPath atomically:YES];
            }


        }
    }
}

}

メモリは、時間とダウンロードされたオブジェクトに応じて増加し、メモリ警告を受け取った後にクラッシュします

事前にご協力いただきありがとうございます。

4

2 に答える 2

0

内側の for ループを autoreleasepool でラップするのは理にかなっていると思います。

このコードでは、内側のループが何回ループされたかはわかりませんが、 @autorelease ブロックでラップすると、割り当てられたメモリがより頻繁に解放されます。

詳細については、これをお読みください

autoreleasepools に関する別の SO 投稿

于 2013-10-08T17:50:59.730 に答える