[問題] (已解決)在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