如何在按下按钮后每秒播放一个短音时释放AVAudioPlayer对象

时间:2010-12-31 10:17:51

标签: ios4 audio avaudioplayer autorelease

我有以下问题让我发疯。 我的应用程序必须在用户按下按钮后每秒播放一次指定次数(例如5)的刻度声音。

我用过这个:

for (int w=1; w<=5; w++) {
[NSThread detachNewThreadSelector:@selector(tic) toTarget:self withObject:nil];
[NSThread sleepForTimeInterval:1.0];
}

其中:

- (void)tic {
NSAutoreleasePool *ticPool = [[NSAutoreleasePool alloc] init];
player_tic = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"tick" ofType:@"aif"]] error:nil];
[player_tic setDelegate:self];
[player_tic play];
[ticPool drain];
}

和:

- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *)player_tic successfully:(BOOL)flag {
NSLog(@"Audio finished playing.");
[player_tic release];
}

一切似乎都有效。我的问题是最终将对象一起释放 我需要在每次播放声音之后,必须立即释放相关的'player_tic'。

其他信息:

在.m:
@synthesize player_tic;

在.h:
@interface myController : UIViewController {
...
AVAudioPlayer *player_tic;
}
@property (nonatomic, retain) AVAudioPlayer *player_tic;

最重要的是,我在汇编中有这个警告:
local declaration of 'player_tic' hides instance variable

请帮帮我! 非常感谢你提前。

- 卡罗

2 个答案:

答案 0 :(得分:0)

我发现System Sound Services比AVAudioPlayer更具响应性。

它还解决了您的发布问题,这是由控制器的retain属性引起的。有关保留/释放的更多信息,请阅读有关内存管理的参考手册。

答案 1 :(得分:0)

我认为你想在设置那个变量时使用self.player_tic,我相信你也想自动释放那个实例。我不确定是否需要设置单独的NSAutoreleasePool。

self.player_tic = [[[AVAudioPlayer alloc] initWithContentsOfURL:... error:nil] autorelease]