IOS-移动到单独的类时播放mp3失败

IOS-移动到单独的类时播放mp3失败,ios,audio,refactoring,mp3,Ios,Audio,Refactoring,Mp3,我成功地在一个类的主体中播放了一个mp3文件。但是,当我将功能移到一个单独的类中时,它失败了 以下是工作代码: NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/A.mp3", [[NSBundle mainBundle] resourcePath]]]; NSError *error; audioPlayer = [[AVAudioPlayer alloc] initWithContents

我成功地在一个类的主体中播放了一个mp3文件。但是,当我将功能移到一个单独的类中时,它失败了

以下是工作代码:

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/A.mp3", [[NSBundle mainBundle] resourcePath]]];

    NSError *error;
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    audioPlayer.numberOfLoops = 0;

    if (audioPlayer == nil)
        NSLog(@"audio errror: %@",[error description]);             
    else 
        [audioPlayer play];
标题:

#import <AVFoundation/AVFoundation.h>

@interface QuestionController : UIViewController 
<UITableViewDataSource, UITableViewDelegate, UISplitViewControllerDelegate>
{
    AVAudioPlayer *audioPlayer;

}
这是新课程:

标题:

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>


    @interface AudioPlayer : NSObject {

    }

    - (void *) playAudioFile:(NSString *) mp3File;

    @end
以下是呼叫代码:

   AudioPlayer *audioPlayer = [[AudioPlayer alloc] init];

   [audioPlayer playAudioFile:@"/A.mp3"];
但是,当它在单独的类中运行时,它不会成功地创建播放器,而是转到“audioplayer==nil”分支

以下是输出:

012-07-21 07:14:54.480 MyQuiz[6655:207] mp3file to play: /A.mp3
2012-07-21 07:15:40.827 MyQuiz[6655:207] audio errror: Error Domain=NSOSStatusErrorDomain Code=-43 "The operation couldn’t be completed. (OSStatus error -43.)"
url为“file://localhost/A.mp3"


知道我做错了什么吗?当我重构到不同的方法时,我总是遇到麻烦。这令人沮丧

弹出的第一件事是在调用play后立即释放音频播放器,而在“工作”类中,这不会发生

解决这个问题的一个好设计是在单例类中实例化音频播放器一次。这个类应该负责在整个应用程序中播放音频,并且应该管理来自所有类的任何请求。这样,您就知道您正在正确地管理内存,并且AVFoundation框架只在一个地方使用

此外,要获取所需路径,请使用:

NSURL *url = [NSURL fileURLWithPath:[[NSString stringWithFormat:@"%@", mp3File] stringByAppendingPathComponent:[[NSBundle mainBundle] resourcePath]]];

如果URL中有错误,请更改此行

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@", mp3File, [[NSBundle mainBundle] resourcePath]]];
为此:

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath], mp3File]];

我想你是对的,释放是个问题。但NSUrl的另一个建议解决方案是解决无效字符串格式的问题。没有问题。无论如何,我建议使用stringByAppendingPathComponent,它更适合您的需要,并且是一种更通用的方法。
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath], mp3File]];