記錄一個(gè)兩年前發(fā)生的尷尬的問題,不論是系統(tǒng)自帶的播放器,還是第三方,都會(huì)出現(xiàn):
需求很簡(jiǎn)單,要求播放器播放一段音頻文件,先展示錯(cuò)誤代碼
- (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];
}
注:重點(diǎn)不是播放器的各種功能,就不弄的那么復(fù)雜了,一切從簡(jiǎn)
然后,發(fā)現(xiàn)沒有聲音,這個(gè)問題當(dāng)時(shí)懵了,沒有找到頭緒,各種亂世,然后試著把問題解決了,解決辦法如下:
@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];
}
辦法一目了然,就是把這個(gè)播發(fā)器變量變成全局的,那時(shí)候突然想起來,最早老師教的時(shí)候,就說過,一定要把播放器聲明成全局的,當(dāng)時(shí)問原因,老師也沒說,他把問題歸結(jié)為Xcode的bug,記住就行了,懵懵懂懂的我就信了,也沒有多想,當(dāng)時(shí)用的是Xcode5,現(xiàn)在馬上都Xcode11了,這個(gè)問題還是有,后來仔細(xì)一想,這個(gè)老師真是誤人子弟啊
我當(dāng)時(shí)也是沒有認(rèn)真的求學(xué)態(tài)度,其實(shí)稍微一想,這個(gè)問題并不難,如果,你把這個(gè)player聲明成局部變量,當(dāng)方法執(zhí)行完畢的時(shí)候,這個(gè)變量被釋放掉了,而[player play]又是個(gè)持續(xù)的過程,變量被釋放掉了,還怎么播放,所以,即使是到了Xcode50,你也得聲明成全局的,所以有問題一定要考慮個(gè)為什么,要不,永遠(yuǎn)都是跟剛學(xué)出來沒區(qū)別,科科!
相同考慮的還有很多,類似的就是地圖定位啊,導(dǎo)航啊之類的!