[问题] (已解决)在class & func 里宣告变量的问题

楼主: illen (Ron)   2018-07-13 17:32:58
各位前辈好,小弟是新手,在练习一个播放声音档的简单App
https://i.imgur.com/gpyS6oj.png
目前写法可以正常的播放note1.wav ~ note7.wav的声音档
想请问 var player:AVAudioPlayer?
这行如果宣告在 func notePressed里(图片中注释的地方)
为何就会拿到nil而无法播放声音档呢?
自己用print测试:
player宣告在class里 -> 取得AVAudioPlayer内存位置,正确播放
player宣告在func notePressed里 -> 拿到nil无法播放
请问同样宣告却不同结果的原因?
谢谢~
作者: yuanruo (罪を憎んで人を憎まず)   2018-07-13 18:23:00
出了scope 被release 不过你在哪边print的?
楼主: illen (Ron)   2018-07-13 18:32:00
我是在 func notePressed里,player的下一行print的y大的意思是出了func notePressed{}的cope后player被释放?但照自己的想法,应该也会播放完声音档后才被释放才对不知道自己是哪边想错了,上面推文是指宣告在注释里的情况
作者: yuanruo (罪を憎んで人を憎まず)   2018-07-13 20:25:00
照理讲你print在player下面应该会有instance但是出了这个IBAction后player被release 所以声音会中止等于你创建完马上就被release 所以根本听不到声音
作者: tkdmaf (皮皮快跑)   2018-07-13 21:42:00
基本上,定义在func外的叫做属性,而不是变量。应该说,在class内但func外的是属性,class外就变全域通常为了正确区分,不建议属性直接用名称来做。而是加上self变成self.xxx来明定这是物件的属性。
楼主: illen (Ron)   2018-07-14 12:26:00
我似乎懂了,虽然我在IBAction里面var player,但是在按下按钮后,虽然有创建成功,但是跳出IBAction的scope后被释放而照原本正确的写法,按下按钮跳出IBAction后,播放声音的值会传给写在class内的属性player,并成功播放出来谢谢两位大大的指点!

Links booklink

Contact Us: admin [ a t ] ucptt.com