2016-07-19 11 views
4

Dies ist ein einfacher akademischer nicht echter Code.EXC_BAD_ACCESS mit self.performSelector

Ich möchte Druckmethode mit PerformSelector-Funktion ausführen. Aber wenn ich diesen Code in Spielplatz ausführen, löst eine Ausnahme aus:

EXC_BAD_ACCESS (Code = EXC_I386_GPFLT).

Code:

//: 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) 

Wo liegt das Problem?

+1

Seltsam, es in einem Spielplatz stürzt aber es funktioniert in einem Projekt. – Moritz

Antwort

3

Versuchen Sie, Ihre Foo.print() zu so etwas wie dies zu ändern:

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

ich den Code glauben auch die im Spielplatz läuft.

performSelector s Rückgabetyp ist nicht Void.

- performSelector:

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

So versucht Spielplatz der Ergebniswert angezeigt zu bekommen. Was tatsächlich nicht zurückgegeben wird.

+0

Ich glaube nicht, da wir das Ergebnis von 'performSelector' nicht ausdrucken, drucken wir das Ergebnis von' timer', was 'Void' ist. – JAL

+0

@JAL, es ist nicht so, wie der Playground jeden Ausdruck behandelt. Irgendwelche Fakten unterstützen Ihre Hypothese? – OOPer

+0

Ja, ändern Sie die Klasse so, dass sie nicht von 'NSObject' erbt und ändern Sie' timer() 'in' (self als AnyObject) .performSelector (#selector (Foo.print)) '. Es gibt keinen Absturz und die Linie wird auf dem Spielplatz als "Null" bewertet. – JAL

3

Hier ist eine Lösung, die keine Änderung der Funktion Signatur erfordert:

class Foo { 

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

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

let instance = Foo() 
instance.timer() 

könnte mit Objective-C-API-Überbrückung zu tun haben, noch zu untersuchen ...