質問

アプリがロードされたときに

私は、配列に画像の一部の遅延ロードをやっています。私は私に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番目のコードスニペットが動作する場合は、あなたが解決のために他の場所で探すべきます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top