[問題] Swift的selector遇到奇怪的bug

看板MacDev作者 (DD魚)時間10年前 (2015/03/12 14:34), 10年前編輯推噓7(707)
留言14則, 4人參與, 最新討論串1/1
範例:http://ppt.cc/fIRF override func viewDidLoad(){ var timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector:"initFoo",userInfo : nil,repeats: false) } func initFoo(){ println("initFoo") } 這段程式執行的時候會導致ViewController Crash掉... 但是如果直接在viewDidLoad裡面執行initFoo()就正常 如果selector 和func 都改成initfoo (全小寫)也是正常 不太確定為啥會有這種BUG ,以後還是別拿保留字當函式名稱一部分了.. PS 用的是XCode 6.1 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.221.141 ※ 文章網址: https://www.ptt.cc/bbs/MacDev/M.1426142080.A.A1F.html

03/12 14:53, , 1F
如果改成 selector:Selector("initFoo") 呢?
03/12 14:53, 1F

03/12 14:56, , 2F
或試試 selector:"initFoo" 不加括弧
03/12 14:56, 2F

03/12 15:00, , 3F
以及加上 @objc func initFoo {... 試試看
03/12 15:00, 3F
剛才試了一下 有沒有加Selector() 和有沒有@objc一共4種組合都會Crash ※ 編輯: fishead1116 (211.21.229.247), 03/12/2015 15:09:12

03/12 15:18, , 4F
有 Crash 的訊息嗎?
03/12 15:18, 4F
在Appdelegate出現 Thread 1: EXC_BAD_ACCESS(code=1 把enable zombie object 選項打開會出現 [(Project名稱).ViewController retain]: message sent to deallocated instance ※ 編輯: fishead1116 (211.21.229.247), 03/12/2015 15:25:32

03/12 15:42, , 5F
看起來是你自己被 dealloc 了, 不是 selector 的問題
03/12 15:42, 5F

03/12 15:42, , 6F
請提供更多資訊以及能實際重現問題的範例
03/12 15:42, 6F
你這麼一說我才發現如果開空Project的話無法重現= ="" 我已經把viewDidLoad砍到剩那一行還是有問題, class裡有幾個用storyboard拉的UILabel,UIButton,UIImageView class有實作CBCentralManagerDelegate,CBPeripheralDelegate 不過那幾個方法完全沒使用到 ※ 編輯: fishead1116 (211.21.229.247), 03/12/2015 16:00:37 BTW 同一個.swift檔案還有一個enum和一個struct 是說,Swift不是自動會dealloc的嗎? ※ 編輯: fishead1116 (211.21.229.247), 03/12/2015 16:03:10

03/12 16:51, , 7F
你的timer被ralease了,建議採用property保持timer的
03/12 16:51, 7F

03/12 16:51, , 8F
reference
03/12 16:51, 8F
還是一樣耶,我上傳我的範例 http://ppt.cc/fIRF 我是用模擬器iOS7.1 和iOS8.1 iPhone 5S 和iPhone 6跑的 ※ 編輯: fishead1116 (211.21.229.247), 03/12/2015 17:02:11

03/12 17:13, , 9F
Swift 有一些情況是不會自動 dealloc 的,所以會造成 memor
03/12 17:13, 9F

03/12 17:13, , 10F
y leak
03/12 17:13, 10F
※ 編輯: fishead1116 (118.163.221.141), 03/12/2015 17:24:53

03/13 18:12, , 11F
不知道為何你的ViewContorler會被release
03/13 18:12, 11F

03/13 18:13, , 12F
hacky的解法是在AppDelegate裡面開一個var 指向他
03/13 18:13, 12F

03/13 18:14, , 13F
這樣可以不會當...但是root Cause 未知
03/13 18:14, 13F
其實只要不要用init開頭就沒有問題 可能跟ViewController的某些方法相衝到了吧

03/13 20:33, , 14F
還真的滿奇怪的,我也想知道解答
03/13 20:33, 14F
※ 編輯: fishead1116 (118.171.154.94), 03/13/2015 22:41:22
文章代碼(AID): #1L0JE0eV (MacDev)
文章代碼(AID): #1L0JE0eV (MacDev)