3

問題
上記の場合、フレームワークは画像データをキャッシュします:

[UIImage imageNamed:]

キャッシュを発生させたくないので、それを置き換えることができます

[UIImage imageOfContentOfFile:]

解決したようですが、私のテストの後、xibのインスタンス化の進行状況で、フレームワークはimageOfContentOfFileではなくimageNamed :を使用します。 つまり、xib によって読み込まれた画像は引き続きキャッシュされます。

そこで、UIImage の imageNamed: メソッドをオーバーライドして、このメソッドをすべてキャッシュしないようにします。

--try1. カテゴリー:

@implementation UIImage (ImageNamedNoCache)

+ (UIImage *)imageNamed:(NSString *)name; 
{
    NSString* path = [[NSBundle mainBundle] pathForResource:name ofType:nil];
    return [UIImage imageWithContentsOfFile:path];
}

@end

--result:warning."カテゴリは、そのプライマリ クラスによっても実装されるメソッドを実装しています"

--try2. ランタイムはメソッドの imp を置き換えます

    //get super method
Method method_imageNamed = class_getClassMethod([UIImage class], @selector(imageNamed:));

//get my method
Method method_myImageNamed = class_getClassMethod([self class], @selector(myImageNamed:));

//get my imp
IMP imp_myImageNamed = method_getImplementation(method_myImageNamed);

//set super method's imp to my imp
method_setImplementation(method_imageNamed, imp_myImageNamed);

--result これらも[UIImage imageNamed:]を呼び出したときに
のみ機能し ますが、xib のインスタンス化は機能しません。

助けて、ありがとう

4

4 に答える 4

1

method swizzlingの仕事のように聞こえます。危険で不必要だと思いますが、もしそうなら、それオプションです. 自己責任。

于 2012-09-27T03:37:42.193 に答える
0
  1. あなたの解決策は良くありません:)キャッシュは正当な理由で使用されます。
  2. [UIImage imageNamed:]あなたのコードでは使用しないでください。すべて問題ありません
  3. 実際に画像をキャッシュする必要がない場合は、方法 2 を使用する必要があります。

: XIBS からの画像 (実際にはすべてのオブジェクト) は、または-[object initWithCoder:]ではなく でロードされています。[UIImage imageNamed:][UIImage imageWithContentsOfFile:]

于 2012-12-05T18:06:20.950 に答える
0

カテゴリ メソッドは問題ないはずです。メソッドに別の名前を付けるだけです。カテゴリ内のメソッドをオーバーライドするのは良い習慣ではないことは理解していますが、新しいメソッドを追加することは問題ありません。

于 2012-09-27T04:49:24.783 に答える
0

正しく解釈しない場合は修正してください。ただし、xibs をロードするときに imageNamed ではなく imageWithContentsOfFile を呼び出すようにフレームワーク (つまり、Apple コード) を取得しようとしていることが主な問題のようです。

3 番目のオプションは、xib の UIImageViews をプレースホルダーとして「空白」のままにし、後でプログラムで UIImages をそれらにロードすることです (たとえば、FileOwner の初期化コードで)。おそらく「tag」プロパティ + 辞書の助けを借りて都合がよければ、正しい画像を決定します。または、画像とそのビューの両方を xib ファイルに保持する代わりに動的に作成することもできます。明らかに、ここには多くのトレードオフがあります。

于 2012-09-27T05:17:21.263 に答える