0

一方で、私はただ興味があります。

もう一方では、作成されたイメージの量を何らかの方法でカウントする必要があります(ある量でクリーンアップをトリガーするため)。残念ながら、メモリの警告が通知されるのが遅すぎます。反応する前にアプリが終了してしまうため、この問題を回避したいと考えています。

UIImage操作を行う前にインクリメントするグローバルカウンターを使用してプロジェクトに散らばることができますが、明らかにこれはまさに私が避けたいことであり、メンテナンス不能なデザインになります。

したがって、プロジェクト全体で MYImage を使用するよりも、サブクラスの UIImage 初期化子 (ある種の MYImage クラス) について考えていましたが、UIImageView はとにかく UIImages を使用します (UIImageView の setImage メソッドを設定できるかもしれませんが、多くの場合、UIKit は実際の _image インスタンス変数を使用するに違いありません) )。

最良の方法は、UIImage サイズからピクセル数をカウントすることです。そのため、特定のピクセル数を超える画像メモリをフラッシュできます。

何か通知?何かトラフカテゴリ?または、ある種の NSObject KVO 観察 (クラス/メソッド名のリテラル チェックを使用) ですか? アイデア/経験はありますか?

4

1 に答える 1

1

これを達成する方法はたくさんあります。1 つの方法は、サブクラスで 1 つ (または複数) のイメージ作成メソッドをオーバーライドし、作成されたイメージのサイズを取得し、それをユーザー デフォルトに追加して、すべてのイメージの累積サイズを追跡することです。たとえば、次のように imageNamed をオーバーライドします。

@implementation RDImage

+(UIImage *)imageNamed:(NSString *) name {
    UIImage *anImage = [super imageNamed:name];
    double oldSize = [[NSUserDefaults standardUserDefaults] doubleForKey:@"SizeAsWxH"];
    [[NSUserDefaults standardUserDefaults] setDouble:(anImage.size.width * anImage.size.height) + oldSize forKey:@"SizeAsWxH"];
    if ([[NSUserDefaults standardUserDefaults] doubleForKey:@"SizeAsWxH"] > 6912) {
        NSLog(@"Too big -- do something");
    }
    return anImage;
}

applicationDidFinishLaunchingWithOptions: メソッドで、そのキーの値をゼロに設定しました。

画像を作成するときのView Controllerでは、クラスを使用して新しい画像を作成します。

UIImage *anImage = [RDImage imageNamed:....

もう 1 つの方法は、UIImageView の setImage: メソッドをオーバーライドし、そのメソッド内で同じことを行うことです。

于 2012-09-26T23:11:23.957 に答える