2

originalImageストア内のすべてMediaのエンティティで名前が付けられたデータ属性を処理したいと考えています。

問題は、自動解放にもかかわらず、 経由でアクセスされるたびにメモリが蓄積されvalueForKey、最終的にアプリがクラッシュすることです。または、問題である大きな個々の NSData アイテムをロードしている可能性がありますが、Instruments は、最終的にメモリ警告を表示してクラッシュするまで、メモリ使用量の着実な傾斜グラフであることを示しています。

このコードの残りの部分はまだ開始していないので、ここで紹介していない隠しタスクは実行していません。

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Media"
                                                      inManagedObjectContext:[self managedObjectContext]];
    [request setEntity:entity];
    [request setFetchBatchSize:10];
    NSArray *mediaItems = [[self managedObjectContext] executeFetchRequest:request error:nil];


    for (NSManagedObject *media in mediaItems) {

        @autoreleasepool {

            [media valueForKey:@"originalImage"];

        }

    }

編集: 今日、NSManagedObject メディアについて言及するだけでも、このメディア リークを引き起こすのに十分なようです。したがって、valueForKey 行がなくても、リークがあります。私はこれを試しました:

    while (i < count) {
        @autoreleasepool {
        NSManagedObject *media = [mediaItems objectAtIndex:i];

            [[self managedObjectContext] refreshObject:media mergeChanges:NO];

        NSLog(@"i: %i", i);
        i++;
        }
    }

これもうまくいかず、同じ時点でクラッシュしました。

4

1 に答える 1

3

次のようなことを試しましたか:

for(int i=0;i<[mediaItems count]; i++) {
    @autoreleasepool {
        NSManagedObject *media = [mediaItems objectAtIndex:i];
        [media valueForKey:@"originalImage"];
    }
}

たぶん、この方法で「メディア」はループごとに適切に解放されます。

(申し訳ありませんが、これをコメントに入れました。私はSOが初めてで、十分な担当者がいません。)

于 2012-09-24T09:23:41.120 に答える