0

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
4

2 に答える 2

1

メモリリークを取り除くための提案:

1) ARC の iOS5 機能を使用します。

2)これを使用して、プロジェクトのメモリリークをさらにチェックアウトします

お役に立てれば

于 2012-09-01T09:33:34.543 に答える
0

MYOpenALSound *sound = [[MyOpenALSound alloc] initWithSoundFile:ファイル名 willRepeat:NO];

これをリリースすることはありません。割り当て時の保持カウントは 1 です。

配列に対して replace を呼び出したり、配列インデックスを NSNull に設定したりしても、オブジェクトは解放されません。

保存しているサウンドのすべてのインスタンスで release を呼び出す必要があります。

于 2012-09-01T11:59:21.450 に答える