Swift中performSelector返回值的用法
最近使用swift,翻譯OC的程式碼時,發現performSelector的返回值與OC中的用法相差很大。在OC中返回的是ID型別,而swift中返回的是 Unmanaged<AnyObject>! 型別,見下圖。
在以前OC中,使用performSelector,直接接受返回值,然後轉成需要的型別進行操作就可以了,但是在swift中是不行的,下面是按OC直接翻譯成swift的程式碼,基本原理是target-action,由mediator傳送訊息給target,觸發target的getPerson()方法,然後建立一個person物件,在外部獲取這個person物件,並呼叫person的run()方法,具體程式碼及結果如下。
從以上程式碼可見,並沒有想OC一樣獲得person物件,下面打斷點來看一下,具體發生了什麼事。
首先可以確定,通過performSelector的方法,有觸發getPerson()方法,且返回了person物件。
但是,在外部接受時,這裡的person並不是我們需要的person物件,而是一個Unmanaged<AnyObject>! 型別,且可以看在這個型別裡面包含了person這個物件,然後我在playground上試驗了一下,發現這個型別裡面的value就是我需要的值
讓我們來看看Unmanaged<AnyObject>! 是個什麼東西
通過文件的字面意思理解,這東西應該是一個用來管理物件的東西,這裡看到了有關於value的方法,然後改動一下程式碼,再看驗證。
這樣就拿到需要的person物件了。
但是,這事還沒完,寫這篇部落格,其實還有一個原因,我在使用swift寫target-action元件化中介軟體時,遇到了物件提前釋放的問題,那麼程式碼就需要這樣寫
如果是記憶體洩露,只要把retain改成release就可以了。