0

iOS アプリケーションでメモリ リークを追跡していますが、奇妙なリークが発生してアプリケーションがクラッシュしました... 責任のあるフレームは CGImageMergeXMPPropsWhithLegacyProps です。ある時点で、アプリがメモリ警告を受け取りました...

私はこのようにALAssetからUIImageを作成しています:

    ALAsset *asset = [assetsArray objectAtIndex:index];
    UIImage *image = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]];

これを解決する方法はありますか?

4

1 に答える 1

3

この助けを願っています。ALAssetも使用していますが、メモリ警告が発生しました。私はまだ私のアプリのソリューションを探しています...クラッシュは、メモリ警告のためにiOSがビューまたはオブジェクトの割り当てを解除したことが原因である可能性があります。したがって、メモリ警告を防ぐことが重要かもしれません。ピークメモリを30MB以下に低く保ちます。ipad2で50MBのメモリ警告が発生しましたが、iphone4から取得できませんでした。とにかく、低いほど良いです。まず、計測器または以下のコードを使用してメモリを測定できます。ロギング用のコードでメモリを測定する方が簡単です。1.メモリ使用量を繰り返し報告するためのタイマーを登録します。この方法でピークメモリ使用量を確認できます。一方で、なぜこの機能が徐々に記憶力を増していくのか、私にはわかりません。2.「iPhoneプログラミングTheBigNerd Ranch Guide」の本によると、iOSのグラフィックメモリは24MBである可能性があります。グラフィカルメモリの使いすぎは、通常、アプリケーションがメモリ不足の警告を受け取る理由です。Appleは、24MBを超えるグラフィックメモリを使用しないことをお勧めします。iPhone画面のサイズの画像の場合、使用されるメモリの量は0.5メガバイトを超えます。各UIView、画像、Core Animationレイヤー、および画面に表示できるその他のものは、割り当てられた24MBの一部を消費します。(Appleは、NSStringsのような他のタイプのデータの最大値を提案していません。)」したがって、グラフィカルなメモリ使用量を確認してください。画面に表示できるその他のものは、割り当てられた24MBの一部を消費します。(Appleは、NSStringsのような他のタイプのデータの最大値を提案していません。)」したがって、グラフィカルなメモリ使用量を確認してください。画面に表示できるその他のものは、割り当てられた24MBの一部を消費します。(Appleは、NSStringsのような他のタイプのデータの最大値を提案していません。)」したがって、グラフィカルなメモリ使用量を確認してください。

NSTimer * timeUpdateTimer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(reportMem) userInfo:nil repeats:TRUE];
[[NSRunLoop mainRunLoop] addTimer:timeUpdateTimer forMode:NSDefaultRunLoopMode];


-(void) reportMem{
[self report_memory1];
}

-(void) report_memory1 {
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
                               TASK_BASIC_INFO,
                               (task_info_t)&info,
                               &size);
natural_t freem =[self get_free_memory];
if( kerr == KERN_SUCCESS ) {
    NSLog(@"Memory in use %f %f(free)", info.resident_size/1000000.0,(float)freem/1000000.0);
} else {
    NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}




}


-(natural_t) get_free_memory {
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;

if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) {
    NSLog(@"Failed to fetch vm statistics");
    return 0;
}

/* Stats in bytes */
natural_t mem_free = vm_stat.free_count * pagesize;
return mem_free;
}
于 2012-11-13T13:52:14.613 に答える