2011-02-13 8 views
3

私はアプリをすばやく作っています。でも、それが最良の解決策ではないにもかかわらず、ほとんどの場合、機能しているようです。だから私は、NSMutableArray arrから画像を取り出す単純な画像ビューを持っています。私は配列を作成し、この方法でViewDidLoadの内部に移入します:私はNSMutableArrayにあまりにも多くを置いていますか?助けてください!

arr = [[NSMutableArray alloc] init]; 

[arr addObject:[UIImage imageNamed:@"181940jpg"]]; 
[arr addObject:[UIImage imageNamed:@"168026.jpg"]]; 
[arr addObject:[UIImage imageNamed:@"168396.jpg"]]; 
[arr addObject:[UIImage imageNamed:@"168493_.jpg"]]; 

私は130枚の画像についてこれを続けます。明らかに、これは大きな配列です。私はこれが本当に悪い方法のようなものかどうかは分かりませんが、そうであれば、私は提案をすることができます!私はいくつかのシンプルなバックとフォワードボタンを使って配列を調べると、単純なカウンタ変数に基づいて配列からイメージを引っ張っていくので、イメージが45-ishまでは正常に動作します。私は別の配列に私の画像を解散した場合、それが役立つだろうImageIOで「ImageProviderCopyImageBlockSetCallback」ヘッダがCFDictionaryではありません...

:アプリは分解し、コンソールは、この意見:

を* ERROR?あまりにも配列に入れすぎていませんか?何が私はここで行方不明、私を信頼して、私はすべての耳です。

おかげ

編集:ここではいくつかのより多くの情報がある

これは私がUISegmentedControlは、画面の一番上に設定し使用して、配列をふるいい方法です:

-(void) pickedOne{ 
if(segmentedControl.selectedSegmentIndex == 1){ 
    NSLog(@"hey"); 
    if(position < [arr count]-1){ 

     position++;//This is my global counter variable 
     UIImage * img = [arr objectAtIndex:position]; 
     [imageView setImage:img]; 
     [img release]; 
    }  

}else if(segmentedControl.selectedSegmentIndex ==0){ 

    if(position >0){ 

     position--; 
     UIImage * img = [arr objectAtIndex:position]; 
     [imageView setImage:img]; 
     [img release]; 
    }  

} 
    } 

それはdoesnのメモリ管理に問題があるように見えますが、私は自分でそれをプロとして考えていません...

+0

私はあなたの実装についてもっと詳しく説明する必要があると思います。 NSMutableはあらかじめ定義されたサイズを持たないため小さすぎることはありません。あなたの問題は、あなたが値にアクセスしてどのように値を出しているかによります。あなたの配列を作成することができれば、その大きさはそれほど大きくありません。 –

答えて

4

あなたがそれに入れたものは、他のオブジェクトへのポインタに過ぎません。それはあなたが心配しなければならないそれらの他のオブジェクトであり、はい、あなたはそれらの数が多すぎます(可能性が高いよりも)。あなたは、オーバー解放問題を抱えているとのImageIOのAPIに偽の何かを渡している以上のように聞こえる

  • ERROR: ImageIO 'ImageProviderCopyImageBlockSetCallback' header is not a CFDictionary...

Would it help if I broke my images up into separate arrays? Am I just putting too much into the array? What am I missing here, trust me, I am all ears.

そして、実際には、それはあなたが持っている正確に何である:

UIImage * img = [arr objectAtIndex:position]; 
    [imageView setImage:img]; 
    [img release]; 

releaseが偽であること。それはあなたのコード内の任意の場所の保持をバランスさせません。 objectAtIndex:は保持されたオブジェクトを返さず、UIViewは内部的にイメージの保持/解放を処理します。

これを削除します。release(およびもう1つも)!

メモリの消費についてはまだ心配する必要があります。それぞれ42Kのサイズ(不合理なサイズではなく完全に構成されています)では、保管の一部として行われる減圧やその他の拡張の前に、約130MBの画像が約6MB程度の重さになります。

これらのデバイスはかなりメモリが制約されています。

関連する問題