NSMutableArrayのでinitWithObjectsクラッシュを使用したNSArrayに画像をロードではなく?
-
22-09-2019 - |
質問
私は、配列に画像の一部の遅延ロードをやっています。私は私にNSMutableArrayのとNSArrayの(私はそれが作成されていたら、配列を変更する必要はありません)が、後者のクラッシュを使用して試してみました。
...
[self performSelectorInBackground:@selector(loadImageArrays) withObject:nil];
...
- (void)loadImageArrays {
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
NSString *fileName;
imageArray = [[NSMutableArray alloc] init];
for(int i = 0; i <= x; i++) {
fileName = [NSString stringWithFormat:@"image_0000%d.png", i];
[imageArray addObject:[UIImage imageNamed:fileName]];
}
[pool drain];
}
タグ対
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
imageArray = [[NSArray alloc] initWithObjects:
[UIImage imageNamed:@"image_00000.png"],
[UIImage imageNamed:@"image_00001.png"],
[UIImage imageNamed:@"image_0000X.png"],
nil];
[pool drain];
NSZombieEnabled = YES後者のコードスニペットを使用する場合、[UIImageに保持]が割り当て解除インスタンスに送信されたことを私に告げます。 両方の配列は私のH-ファイルで(非アトミック、保持)特性を有します。画像はNSArrayのによって保持されていないのはなぜ?
解決
UIImage
はスレッドセーフではないのUIKitの一部です。例えば、メソッドimageNamed:
可能性壊れグローバルネーム画像辞書そのキャッシュのUIImage
クラス用途
あなたがバックグラウンドスレッドで画像をロードしたい場合はコアグラフィックスを使用する必要があります。
:あなたのコメントに答えるために、編集
あなたがしてPNGファイルを読み込むことができます:
CGDataProviderRef source = CGDataProviderCreateWithURL((CFURLRef)url);
CGImageRef image = CGImageCreateWithPNGDataProvider(source, NULL, NO, kCGRenderingIntentDefault);
CFRelease(source);
A CGImage
コア基礎オブジェクトであり、NSArray
に格納することができます。あなたはその後、(もちろん、メインスレッド上で)それからUIImage
を作ることができます:
[[UIImage alloc] initWithCGImage:image]
他のヒント
、私は自分自身疑問に思います。何かが、これは純粋に不変問題で対変更できませんと言われます。あなたのプールのように見えますが(嫌な音)途中で排出されます。ではない、それは違いを作る必要がありますが、あなたが実行して、新しいスレッドを作成しようとすることができること;
[NSThread detachNewThreadSelector:@selector(loadImageArrays) toTarget:self withObject:nil];
私は結果の単純興味..また、クリーンな環境(:なし他のコードの周りですなわち)の両方でスニペットを試してみてください。 2番目のコードスニペットが動作する場合は、あなたが解決のために他の場所で探すべきます。