- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类,我调用它来利用 AVAudioPlayer
,并且在播放音频时一切正常,但是当 -audioPlayerDidFinishPlaying:
被称为我的NSLog()
命令表示玩家被释放;问题是应用程序稍后就会崩溃。我应该提到 audioPlayer
是此类中的一个 ivar。这是代码:
-(id) initWithFileName:(NSString *)sndFileName
{
[super init];
sndFileToPlay = [[NSString alloc] initWithString:sndFileName];
return self;
}
-(void)dealloc {
[audioPlayer release];
self.audioPlayer.delegate = nil;
self.audioPlayer = nil;
[super dealloc];
}
-(void)play
{
[self playSound:sndFileToPlay];
}
-(void)playSound:(NSString *)fileName
{
NSString *fname, *ext;
NSRange range = [fileName rangeOfString:@"."];
int location = range.location;
if( location > 0 )
{
fname = [fileName substringWithRange:NSMakeRange(0, location)];
ext = [fileName substringFromIndex:location+1];
[self playSound:fname :ext];
}
}
—
-(void)playSound:(NSString *)fileName :(NSString *)fileExt
{
NSBundle *mainBundle = [NSBundle mainBundle];
NSURL *fileURL = [NSURL fileURLWithPath:
[mainBundle pathForResource:fileName ofType:fileExt] isDirectory:NO];
if (fileURL != nil)
{
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
error: nil];
[fileURL release];
[audioPlayer setDelegate:self];
[audioPlayer play];
}
}
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player
successfully:(BOOL)flag
{
NSLog(@"Releasing");
[audioPlayer release];
}
最佳答案
您的代码存在一些问题。
例如,在您的 dealloc
中:
[audioPlayer release];
self.audioPlayer.delegate = nil;
self.audioPlayer = nil;
您正在释放audioPlayer,然后,在已释放(可能是已释放)的播放器上,您将委托(delegate)设置为nil,然后将属性设置为nil,这将再次释放它。删除[audioPlayer release];
。
在您的 audioPlayerDidFinishPlaying:successively:
中,您也释放了播放器,但尚未将变量设置为 nil
。这可能会导致崩溃,因为当您再次访问该变量时,该内存地址可能有不同的对象。请使用该属性,并像在 dealloc
中那样执行操作:
self.audioPlayer.delegate = nil;
self.audioPlayer = nil;
然后,在 playSound::
(呃,未命名的第二个参数!)中,您过度释放了 fileURL
。 -[NSURL fileURLWithPath:isDirectory:]
返回一个自动释放的对象,您不能释放它。
最后但也许并非最不重要的一点是,您泄漏了 sndFileToPlay
,您需要在 dealloc
方法中释放它。而不是 sndFileToPlay = [[NSString alloc] initWithString:sndFileName];
只需执行 sndFileToPlay = [sndFileName copy];
。
您可能想阅读有关 Objective-C 内存管理的内容。一旦您了解了三四个经验法则,这就不难了。
关于iphone - audioPlayerDidFinishPlaying : called之后的EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6426133/
我有一个类,我调用它来利用 AVAudioPlayer ,并且在播放音频时一切正常,但是当 -audioPlayerDidFinishPlaying: 被称为我的NSLog() 命令表示玩家被释放;问
我正在使用AVAudioPlayer类播放音频,但是问题是,当我播放音频时,即使文件播放完并且即使将循环数设置为1,也无法在audioPlayerDidFinishPlaying中收到回调。 这是代码
这个问题已经有答案了: AVAudioPlayer.play() does not play sound (1 个回答) 已关闭 3 年前。 遇到问题 audioPlayerDidFinishPlay
class ViewController: UIViewController, AVAudioPlayerDelegate { func audioPlayerDidFinishPlaying
Player1 运行良好,但我在执行 Player2 时出错。 我应该如何更改 audioPlayerDidFinishPlaying 以使其工作? 这是我的 ViewController.swift
我在 MainStoryBoard 上创建了带有图像的 UIButton。当我按下该按钮时,它会播放一个音频文件,并且在播放音频时 UIButton 的背景颜色会发生变化。 audioPlayerDi
我在使用 AVAudioPlayer 时遇到问题。我想在我的声音文件完成后做点什么。正在播放声音,但未调用 audioPlayerDidFinishPlaying。 我的.h #import "Vie
我创建了一个自定义类来处理音频播放。 音频播放.h #import #import "AVFoundation/AVAudioPlayer.h" #import @interface AudioP
当我按下“yourButton”或“yourButton2”或“yourButton3”时,每个按钮都会播放一个音频文件,并且在播放音频时,UIButton 被设置为选中状态。 我希望“yourBut
我在 MainStoryBoard 上创建了三个 UIButton。 当我按下“yourButton3”时,不会调用 player3。 我发现更改 else if 子句或将某些内容分配给 player
我正在使用 AVFoundation 框架快速编写一个简单的播放器。一切似乎都正常,除了我的播放器一直在一遍又一遍地播放同一首歌曲。我的播放列表中只有一首歌,所以这是有道理的。我想要做的是检查 aud
我遇到了 AVAudioPlayer 类的奇怪问题,audioPlayerDidFinishPlaying:successfully: 回调有时 未被调用。开始播放的代码的精简版本看起来像, self
我是一名优秀的程序员,十分优秀!