3

Objective-C にジェネリック ポインタがあるとします。このポインターは、Classオブジェクトであるか、そのクラスのインスタンスである可能性があります。両者の違いを見分ける方法はありますか?

例:


id pointerA = [someClass class];
id pointerB = [[someClass alloc] init];

bool pointerAIsAClass = is_this_a_Class(pointerA); // should be true
bool pointerBIsAClass = is_this_a_Class(pointerB); // should be false

適切な値is_this_a_Classを返すようにするには、関数をどのように記述すればよいでしょうか?bool

bool is_this_a_Class(id somePointer)
{
    // your code goes here
}
4

2 に答える 2

4

私はより良い方法を見ていないし、これは絶対確実ではありませんが、これはうまくいくはずです:

BOOL pointer_isClass(id object) {
    return [object respondsToSelector:@selector(instancesRespondToSelector:)];
}

理論的には、Classオブジェクトのみが-instancesRespondToSelector:メッセージに応答するため、これは機能するはずです。実際の呼び出しの外では、objc_*このための実際の API は表示されません。

更新:
Giao の回答を読んだ後、別の考えが思い浮かびました。メソッドに対するポインターの応答をテストします-class。クラス オブジェクトでの呼び出しは、オブジェクト インスタンスでの-class呼び出しと同等である必要があり-selfますが、オブジェクト インスタンスで別のオブジェクトを返します。

BOOL pointer_isClass(id object) {
    return object == [object class];
}

特にオブジェクトインスタンスが-instancesRespondToSelector:これを実装している場合は、100% の確率で動作するはずです。

于 2008-12-10T07:40:07.950 に答える
3

最も正しい方法は、オブジェクトのクラスをチェックして、それがメタクラスかどうかを確認することです。

BOOL object_isClass(id object) {
    return class_isMetaClass(object_getClass(object));
}

ここにもっと答えがあります:オブジェクトがクラス型かどうかを確認してください

于 2011-07-22T22:53:01.557 に答える