作者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/m.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