簡體   English   中英

使用self.performSelector的EXC_BAD_ACCESS

[英]EXC_BAD_ACCESS using self.performSelector

這是一個簡單的學術而不是真正的代碼。

我想使用performSelector函數運行print方法。 但是,如果我在操場上運行此代碼,則拋出異常:

EXC_BAD_ACCESS(代碼= EXC_I386_GPFLT)。

碼:

//: Playground - noun: a place where people can play

import UIKit

@objc(Foo)
class Foo: NSObject {

    func timer() {
        self.performSelector( #selector(Foo.print))
    }

    @objc func print() {
        NSLog("print")
    }
}

let instance = Foo()
instance.timer()     // <-- EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

問題出在哪兒?

嘗試將您的Foo.print()更改為以下內容:

    @objc func print() -> AnyObject? {
        NSLog("print")
        return nil
    }

我相信代碼也在Playground中運行。

performSelector的返回類型不是Void

- performSelector:

 func performSelector(_ aSelector: Selector) -> Unmanaged<AnyObject>! 

因此,Playground會嘗試顯示結果值。 實際上並沒有退回。

這是一個不需要更改函數簽名的解決方案:

class Foo {

    func timer() {
        (self as AnyObject).performSelector(#selector(Foo.print))
    }

    @objc func print() {
        NSLog("print")
    }
}

let instance = Foo()
instance.timer()

可能與Objective-C API橋接有關,仍在調查......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM