iOS 音乐播放器不播放问题

记录一个两年前发生的尴尬的问题,不论是系统自带的播放器,还是第三方,都会出现:
需求很简单,要求播放器播放一段音频文件,先展示错误代码

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *str=[[NSBundle mainBundle] pathForResource:@"BraveHeart" ofType:@"mp3"];
    NSURL *url=[NSURL fileURLWithPath:str];
    AVAudioPlayer *player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
    [player play];
    
}

注:重点不是播放器的各种功能,就不弄的那么复杂了,一切从简
然后,发现没有声音,这个问题当时懵了,没有找到头绪,各种乱世,然后试着把问题解决了,解决办法如下:

@interface ViewController ()
@property (strong ,nonatomic)AVAudioPlayer *player;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *str=[[NSBundle mainBundle] pathForResource:@"BraveHeart" ofType:@"mp3"];
    NSURL *url=[NSURL fileURLWithPath:str];
    _player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
    [_player play];
    
}

办法一目了然,就是把这个播发器变量变成全局的,那时候突然想起来,最早老师教的时候,就说过,一定要把播放器声明成全局的,当时问原因,老师也没说,他把问题归结为Xcode的bug,记住就行了,懵懵懂懂的我就信了,也没有多想,当时用的是Xcode5,现在马上都Xcode11了,这个问题还是有,后来仔细一想,这个老师真是误人子弟啊
我当时也是没有认真的求学态度,其实稍微一想,这个问题并不难,如果,你把这个player声明成局部变量,当方法执行完毕的时候,这个变量被释放掉了,而[player play]又是个持续的过程,变量被释放掉了,还怎么播放,所以,即使是到了Xcode50,你也得声明成全局的,所以有问题一定要考虑个为什么,要不,永远都是跟刚学出来没区别,科科!
相同考虑的还有很多,类似的就是地图定位啊,导航啊之类的!

你可能感兴趣的:(iOS 音乐播放器不播放问题)