作者illen (Ron)
看板MacDev
标题[问题] 在class & func 里宣告变数的问题
时间Fri Jul 13 17:32:58 2018
各位前辈好,小弟是新手,在练习一个播放声音档的简单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无法播放
请问同样宣告却不同结果的原因?
谢谢~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.24.26.81
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MacDev/M.1531474381.A.925.html
1F:→ yuanruo: 出了scope 被release 不过你在哪边print的? 07/13 18:23
2F:→ illen: 我是在 func notePressed里,player的下一行print的 07/13 18:32
3F:→ illen: y大的意思是出了func notePressed{}的cope後player被释放? 07/13 19:49
4F:→ illen: 但照自己的想法,应该也会播放完声音档後才被释放才对 07/13 19:50
5F:→ illen: 不知道自己是哪边想错了,上面推文是指宣告在注释里的情况 07/13 19:51
6F:→ yuanruo: 照理讲你print在player下面应该会有instance 07/13 20:25
7F:→ yuanruo: 但是出了这个IBAction後player被release 所以声音会中止 07/13 20:26
8F:→ yuanruo: 等於你创建完马上就被release 所以根本听不到声音 07/13 20:26
9F:→ tkdmaf: 基本上,定义在func外的叫做属性,而不是变数。 07/13 21:42
10F:→ tkdmaf: 应该说,在class内但func外的是属性,class外就变全域 07/13 21:43
11F:→ tkdmaf: 通常为了正确区分,不建议属性直接用名称来做。 07/13 21:44
12F:→ tkdmaf: 而是加上self变成self.xxx来明定这是物件的属性。 07/13 21:44
13F:→ illen: 我似乎懂了,虽然我在IBAction里面var player,但是在按下 07/14 12:26
14F:→ illen: 按钮後,虽然有创建成功,但是跳出IBAction的scope後被释放 07/14 12:28
15F:→ illen: 而照原本正确的写法,按下按钮跳出IBAction後,播放声音 07/14 12:31
16F:→ illen: 的值会传给写在class内的属性player,并成功播放出来 07/14 12:32
17F:→ illen: 谢谢两位大大的指点! 07/14 12:33