我有一个简单的交互式应用程序,包含10个IBActions,每个都与动画和声音相关联。在多次敲击之后,声音停止工作(虽然在音乐按钮的情况下它会继续播放,但没有其他声音可以工作,但一旦关闭所有声音停止)但动画和其他一切运行良好。这是很多水龙头...但是经过几分钟的互动,即。大约50次点击这种情况。
我看到仪器没有泄漏......一切看起来都很好,它只是停止工作?
任何想法可能会发生什么?
我正在使用带代码的AVAudioPlayer框架
AVAudioPlayer *bubblesound;
-(IBAction) getBubbles:(id)sender {
NSString *bubblesgoblip = [[NSBundle mainBundle] pathForResource:@"boingy1" ofType:@"mp3"];
bubblesound = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:bubblesgoblip] error:NULL];
[bubblesound play]; }
-(void)dealloc {
[bubblesound release];
}
答案 0 :(得分:2)
很奇怪,当你一次又一次地发起起泡时,你不会泄漏。
任何方式:
如果您正在使用短按钮音效,最好尝试使用“ SystemSoundID ”而不是AVAudioPlayer。这就是苹果推荐的。
<强> Etited 强> apple有一个很好的例子,包括这个文件 -
.h文件
#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>
@interface SoundEffect : NSObject {
SystemSoundID _soundID;
}
+ (id)soundEffectWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfFile:(NSString *)path;
- (void)play;
@end
.m文件
#import "SoundEffect.h"
@implementation SoundEffect
+ (id)soundEffectWithContentsOfFile:(NSString *)aPath {
if (aPath) {
return [[[SoundEffect alloc] initWithContentsOfFile:aPath] autorelease];
}
return nil;
}
- (id)initWithContentsOfFile:(NSString *)path {
self = [super init];
if (self != nil) {
NSURL *aFileURL = [NSURL fileURLWithPath:path isDirectory:NO];
if (aFileURL != nil) {
SystemSoundID aSoundID;
OSStatus error = AudioServicesCreateSystemSoundID((CFURLRef)aFileURL, &aSoundID);
if (error == kAudioServicesNoError) { // success
_soundID = aSoundID;
} else {
NSLog(@"Error %ld loading sound at path: %@", error, path);
[self release], self = nil;
}
} else {
NSLog(@"NSURL is nil for path: %@", path);
[self release], self = nil;
}
}
return self;
}
-(void)dealloc {
AudioServicesDisposeSystemSoundID(_soundID);
[super dealloc];
}
-(void)play {
AudioServicesPlaySystemSound(_soundID);
}
@end
现在您可以在视图中准备好声音了吗?
NSBundle *mainBundle = [NSBundle mainBundle];
sound1 = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"doorloop1" ofType:@"caf"]];
sound2 = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"doorloop1" ofType:@"caf"]];
最后在你的行动中
-(IBAction) getBubbles:(id)sender {
[sound1 play];
}
不要忘记释放声音。