/ / SwiftのdoesNotRecognizeSelectorをオーバーライドできるので、アプリが一部のセレクタでクラッシュすることはありませんか? [閉鎖] - イオス、スウィフト

SwiftのdoesNotRecognizeSelectorをオーバーライドして、一部のセレクタでアプリがクラッシュすることはありませんか? [閉鎖] - イオス、スウィフト

ここに私のコードです:

class RNObserverManager: NSObject {
var observers:Set<NSObject> = []

override func doesNotRecognizeSelector(aSelector: Selector){
var isRecognized = false
for observer in observers{
if observer.respondsToSelector(aSelector){
observer.performSelector(aSelector)
isRecognized = true
}
}
if  !isRecognized{
super.doesNotRecognizeSelector(aSelector)
}
}
}

私が電話してもアプリケーションがクラッシュする super.doesNotRecognizeSelector(aSelector) か否か。
私は上書きしようと戦う doesNotRecognizeSelector()私のカスタムクラスは動的にいくつかのセレクタに応答することができます。

私が呼び出す場合 super.doesNotRecognizeSelector(aSelector)

未知の例外「NSInvalidArgumentException」、理由: " - [ObserverTrampoline.RNObserverManager doSomething]:インスタンスに送信された認識できないセレクタ0x7fdfebdb42e0"

  1. 私が電話しなければ super.doesNotRecognizeSelector(aSelector)

EXC_BREAKPOINT

回答:

回答№1は1

クラッシュすることなく認識できないメッセージを動的に処理したい場合は、 forwardInvocation: (そして methodSignatureForSelector:)Objective-C(Swiftでは利用できません)。 1つのオブザーバーに転送するだけであれば、より簡単な方法はオーバーライドすることです forwardingTargetForSelector: (これはSwiftで利用可能ですが)複数のことをやりたい、あるいは他の複雑なことをする必要がある場合は、 forwardInvocation:.