0

更新このコードは、実際には問題のある場所ではありません。すべてのCoreGraphics行をコメントアウトし、結果として配列の最初の画像を返すことでクラッシュの発生を防ぐことはできないため、さらに上流を調べる必要があります。

私はこれを75msのNSTimerで実行しています。480x360の画像で完全に動作し、クラッシュすることなく1日中実行されます。

しかし、1024x768の画像を送信すると、約20秒後にクラッシュし、メモリ不足の警告がいくつか表示されます。

どちらの場合も、Instrumentsは完全に通常のメモリ使用量を示します。フラットな割り当てグラフ、1メガバイト未満のライブバイト、常にリークはありません。

どうしたの?Core Graphicsは、どういうわけか、表示せずにメモリを使いすぎていませんか?

また、言及する価値があります。(NSMutableArray *)imgsにはそれほど多くの画像はありません。通常は3つ、場合によっては2つまたは4つです。関係なくクラッシュします。2つしかない場合は、クラッシュが少し少なくなります。

- (UIImage*) imagefromImages:(NSMutableArray*)imgs andFilterName:(NSString*)filterName {

    UIImage *tmpResultant = [imgs objectAtIndex:0];

    CGSize s = [tmpResultant size];

    UIGraphicsBeginImageContext(s);

    [tmpResultant drawInRect:CGRectMake(0, 0, s.width, s.height) blendMode:kCGBlendModeNormal alpha:1.0];

    for (int i=1; i<[imgs count]; i++) { [[imgs objectAtIndex:i] drawInRect:CGRectMake(0, 0, s.width, s.height) blendMode:kCGBlendModeMultiply alpha:1.0]; }

    tmpResultant =  UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return tmpResultant;
}
4

1 に答える 1

0

問題はあなたが示したコードの外にあるように私には聞こえます。画面に表示される画像には、アプリのメモリの外側にwidth * height*bytes_per_pixelのバッキングストアがあります。また、バッキングストアが多すぎると、メモリの警告とアプリの終了が発生します。

表示用にこれらの画像のより小さな最適化バージョンを作成するか、バッキングストアをリリースできるようにするために、そこで最適化する必要がある場合があります。また、変更されていない特定のレイヤーのラスタライズをオンにすると、UIImageを操作するのではなく、レイヤーのコンテンツをCGImageに直接設定するのに役立ちます。

他のコードがない問題を示すサンプルプロジェクトを作成し、まだメモリが不足していないかどうかを確認する必要があります。しかし、私が思うに、あなたが示したコードだけでは、他の場所にあるisseを再現することはできません。

于 2012-12-13T05:59:19.880 に答える