[問題] (已解決)在class & func 裡宣告變數的問題

看板MacDev作者 (Ron)時間5年前 (2018/07/13 17:33), 編輯推噓0(0017)
留言17則, 3人參與, 5年前最新討論串1/1
各位前輩好,小弟是新手,在練習一個播放聲音檔的簡單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://www.ptt.cc/bbs/MacDev/M.1531474381.A.925.html

07/13 18:23, 5年前 , 1F
出了scope 被release 不過你在哪邊print的?
07/13 18:23, 1F

07/13 18:32, 5年前 , 2F
我是在 func notePressed裡,player的下一行print的
07/13 18:32, 2F

07/13 19:49, 5年前 , 3F
y大的意思是出了func notePressed{}的cope後player被釋放?
07/13 19:49, 3F

07/13 19:50, 5年前 , 4F
但照自己的想法,應該也會播放完聲音檔後才被釋放才對
07/13 19:50, 4F

07/13 19:51, 5年前 , 5F
不知道自己是哪邊想錯了,上面推文是指宣告在註釋裡的情況
07/13 19:51, 5F

07/13 20:25, 5年前 , 6F
照理講你print在player下面應該會有instance
07/13 20:25, 6F

07/13 20:26, 5年前 , 7F
但是出了這個IBAction後player被release 所以聲音會中止
07/13 20:26, 7F

07/13 20:26, 5年前 , 8F
等於你創建完馬上就被release 所以根本聽不到聲音
07/13 20:26, 8F

07/13 21:42, 5年前 , 9F
基本上,定義在func外的叫做屬性,而不是變數。
07/13 21:42, 9F

07/13 21:43, 5年前 , 10F
應該說,在class內但func外的是屬性,class外就變全域
07/13 21:43, 10F

07/13 21:44, 5年前 , 11F
通常為了正確區分,不建議屬性直接用名稱來做。
07/13 21:44, 11F

07/13 21:44, 5年前 , 12F
而是加上self變成self.xxx來明定這是物件的屬性。
07/13 21:44, 12F

07/14 12:26, 5年前 , 13F
我似乎懂了,雖然我在IBAction裡面var player,但是在按下
07/14 12:26, 13F

07/14 12:28, 5年前 , 14F
按鈕後,雖然有創建成功,但是跳出IBAction的scope後被釋放
07/14 12:28, 14F

07/14 12:31, 5年前 , 15F
而照原本正確的寫法,按下按鈕跳出IBAction後,播放聲音
07/14 12:31, 15F

07/14 12:32, 5年前 , 16F
的值會傳給寫在class內的屬性player,並成功播放出來
07/14 12:32, 16F

07/14 12:33, 5年前 , 17F
謝謝兩位大大的指點!
07/14 12:33, 17F
文章代碼(AID): #1RI77Dab (MacDev)