0

フォトアルバムのようなビューを作ろうとしています。ただし、画像ファイルはかなり大きいです (2048x1536、png)。複数の画像を読み込むにはかなり時間がかかります。ということで画像読み込み用のスレッドを作成。まずは画像ホルダー用のUIButtonを作成。

UIButton* thumbnail = [[UIButton alloc] initWithFrame:r];
[[self scroll] addSubview:thumbnail];
[thumbnail release];

画像読み込み用のスレッドを開始します

[NSThread detachNewThreadSelector:@selector(th_load_filelist) toTarget:self withObject:nil];

スレッドはこちら

-(void) th_load_filelist
{
   NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];    
   for (UIButton* bt in [self.scroll subviews])
   {
      UIImage* img = [[UIImage alloc] initWithContentsOfFile:(NSString*)bt.tag];
      [[bt layer] performSelectorOnMainThread:@selector(setContents:) withObject:(id)[img CGImage] waitUntilDone:YES];
      [img release];
   }

   [pool release];
}

それはうまくいきます。通常の状況で。ただし、画像が多い場合やメモリ警告が発生する場合があります。アプリはエラー メッセージなしでクラッシュします。修正するためのヒントを教えてください。大きな画像が原因でメモリに問題があると思われます..

4

1 に答える 1

0

問題は同期と非同期のロードではなく、メモリにロードしているピクセルの量です。メモリの使用量が多すぎるため、アプリがシステムによって強制終了されています。

この問題を解決するには、サーバーに 1:1 サイズの画像 (Retina 以外の iPhone の場合は 320x480) と、メモリに読み込まれないより大きな画像の両方を提供させます。次に、必要な場合(ズームインまたは高解像度画面での表示)にのみ、大きな画像(UIImageなど)をメモリにロードします。

于 2013-01-22T18:43:27.847 に答える