これはテストに非常に簡単です:BがAのメソッドをオーバーライドする場合
if (method_getImplementation(class_getInstanceMethod(A, @selector(methodRed))) ==
method_getImplementation(class_getInstanceMethod(B, @selector(methodRed))))
{
// B does not override
}
else
{
// B overrides
}
私が知っているか疑問しなければならないのに便利ですが、あなたが知りたい場合、これはあなたが見つける方法です。
厳密に言えば、上のコードは、Bのセレクタの実装がAのセレクタの実装と異なるかどうかを判断します.A> X> Bのような階層を持つ場合は、 Xはセレクタをオーバーライドしますが、Bが優先クラスではないにもかかわらず、これはAとBの間の異なる実装を報告します。あなたが特に知りたい場合は、「Bオーバーライドは、このセレクタ(関係なく、何かの)ん」あなたがしたいと思う:
if (method_getImplementation(class_getInstanceMethod(B, @selector(methodRed))) ==
method_getImplementation(class_getInstanceMethod(class_getSuperclass(B), @selector(methodRed))))
{
// B does not override
}
else
{
// B overrides
}
これは、おそらく明らかに、「Bは、セレクタの異なる実装を持っていない質問をしますそのスーパークラス "よりも(おそらくもっと具体的に)あなたが求めていたものです。お使いのベースクラス内
更新いただきありがとうございます。私はあなたに別の投票を与えるだろうが、私はすでにあなたに1つを与えた。 – cnotethegr8
このコードを使用している人は、 '#import' –
cnotethegr8
する必要があります。さらに簡単です: 'class_getMethodImplementation()'は上記の2つの連鎖呼び出しを置き換えることができます。詳細はhttps://developer.apple.com/documentation/cocoa/reference/objcruntimerefをご覧ください。 –