看板 MacDev 關於我們 聯絡資訊
各位前輩好,小弟是新手,在練習一個播放聲音檔的簡單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
yuanruo: 出了scope 被release 不過你在哪邊print的? 07/13 18:23
illen: 我是在 func notePressed裡,player的下一行print的 07/13 18:32
illen: y大的意思是出了func notePressed{}的cope後player被釋放? 07/13 19:49
illen: 但照自己的想法,應該也會播放完聲音檔後才被釋放才對 07/13 19:50
illen: 不知道自己是哪邊想錯了,上面推文是指宣告在註釋裡的情況 07/13 19:51
yuanruo: 照理講你print在player下面應該會有instance 07/13 20:25
yuanruo: 但是出了這個IBAction後player被release 所以聲音會中止 07/13 20:26
yuanruo: 等於你創建完馬上就被release 所以根本聽不到聲音 07/13 20:26
tkdmaf: 基本上,定義在func外的叫做屬性,而不是變數。 07/13 21:42
tkdmaf: 應該說,在class內但func外的是屬性,class外就變全域 07/13 21:43
tkdmaf: 通常為了正確區分,不建議屬性直接用名稱來做。 07/13 21:44
tkdmaf: 而是加上self變成self.xxx來明定這是物件的屬性。 07/13 21:44
illen: 我似乎懂了,雖然我在IBAction裡面var player,但是在按下 07/14 12:26
illen: 按鈕後,雖然有創建成功,但是跳出IBAction的scope後被釋放 07/14 12:28
illen: 而照原本正確的寫法,按下按鈕跳出IBAction後,播放聲音 07/14 12:31
illen: 的值會傳給寫在class內的屬性player,並成功播放出來 07/14 12:32
illen: 謝謝兩位大大的指點! 07/14 12:33