Instruments でアプリケーションのメモリの問題を確認しようとしています。アプリケーションをロードすると、いくつかのサウンドが再生され、UIImageViews でいくつかのアニメーションが表示されます。メモリを節約するために、必要なときだけサウンドをロードし、再生を停止するとメモリから解放します。
問題 1:
私のアプリケーションは約 5.5MB の Living メモリを使用しています。しかし、全体のセクションは開始後 20MB まで成長し、その後ゆっくりと成長しています (約 100kB/秒)。しかし、責任のあるライブラリは、OpenAL (OAL::Buffer)、dyld (_dyld_start) です。これが実際に何であるかはわかりません。また、ft_mem_qrealloc、CGFontStrikeSetValue などの他のものもあります。
問題 2:
全体のセクションが約 30MB 壊れると、アプリケーションがクラッシュします (強制終了されます)。全体的なメモリについて既に読んだ事実によると、それは私のすべての割り当てと解放が約30MBであることを意味します。しかし、私は本当に問題がわかりません。たとえば、サウンドが必要なときはメモリにロードし、不要になったらリリースします。ただし、1MB のサウンドをロードすると、この操作によって全体的なメモリ使用量が 2MB 増加します。私は正しいですか?そして、10個のサウンドをロードすると、アプリがクラッシュするという理由だけで、全体的に高すぎて、生活がまだ低いという事実がありますか??? 私はそれについて非常に混乱しています。
誰かがそれを片付けるのを手伝ってくれませんか?
(私は iOS 5 で ARC を使用しています)
いくつかのコード:
サウンドの作成 OpenAL:
MYOpenALSound *sound = [[MyOpenALSound alloc] initWithSoundFile:filename willRepeat:NO];
if(!sound)
return;
[soundDictionary addObject:sound];
遊ぶ:
[sound play];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, ((sound.duration * sound.pitch) + 0.1) * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
[soundDictionary removeObjectForKey:[NSNumber numberWithInt:soundID]];
});
}
AVAudioPlayer でサウンドを作成する:
[musics replaceObjectAtIndex:ID_MUSIC_MAP withObject:[[Music alloc] initWithFilename:@"mapMusic.mp3" andWillRepeat:YES]];
pom = [musics objectAtIndex:musicID];
[pom playMusic];
停止して解放します。
[musics replaceObjectAtIndex:ID_MUSIC_MAP withObject:[NSNull null]];
そして画像アニメーション:私は大きなPNGファイルから画像をロードします(これは私の他のトピックにも当てはまります:https://stackoverflow.com/questions/12223714/memory-warning-uiimageview-and-its-animations)アニメーション配列を設定してアニメーションを再生しています...
UIImage *source = [[UIImage alloc] initWithCGImage:[[UIImage imageNamed:@"imageSource.png"] CGImage]];
cutRect = CGRectMake(0*dimForImg.width,1*dimForImg.height,dimForImg.width,dimForImg.height);
image1 = [[UIImage alloc] initWithCGImage:CGImageCreateWithImageInRect([source CGImage], cutRect)];
cutRect = CGRectMake(1*dimForImg.width,1*dimForImg.height,dimForImg.width,dimForImg.height);
...
image12 = [[UIImage alloc] initWithCGImage:CGImageCreateWithImageInRect([source CGImage], cutRect)];
NSArray *images = [[NSArray alloc] initWithObjects:image1, image2, image3, image4, image5, image6, image7, image8, image9, image10, image11, image12, image12, image12, nil];
この配列は、次のように単純に使用します。
myUIImageView.animationImages = images, ... duration -> startAnimating