2

メッセージを送信する必要がある目的の C クラスにポインターがあります。ポインターは何でもかまいません。そのため、メッセージを送信する前に、ポインターがメッセージに応答することを確認する必要があります。チェックを行うために使用している関数は次のとおりです。

int delegatePreparedForSelector(id delegate, SEL aSelector) {
    if (delegate 
        && [delegate isKindOfClass:[NSObject class]]
        && [delegate respondsToSelector:aSelector]) {
        return YES;
    }
    return NO;
}

問題は、デリゲート ポインターが である場合があり、メッセージを送信struct objc-object *するとEXC_BAD_ACCESS不正なアクセス エラーが発生することです。isKindOfClass

代理人が私のメッセージに応答するかどうかを判断するために使用する必要がある、より良いテストはありますか?

4

3 に答える 3

6

ちょっと待って、ポインタは何でもいいって本当ですか?void *未加工の malloc されたメモリのチャンク、または NSObject から派生していない objc_object へのポイントのように? その場合、これを安全に機能させる方法はありません。これは、「このポインターを逆参照せずに、逆参照しても安全であることをどうやって知ることができるでしょうか?」と言うのと同じです。唯一の方法は、渡されたものが何であれ、悪いポインターを渡さなかったというアプリオリな知識を持つことです。

EXEC_BAD_ACCESS をクリーンアップするためにいくつかのシグナル ハンドラー コードを作成することを試みることはできますが、最終的には動作が遅く、貧弱になり、他の多くの実際のバグが隠されます。現実的には、渡されるものにいくつかの制約があるか、プロジェクトのこの部分を再構築する必要があります。

于 2009-10-05T20:52:27.860 に答える
5

代理人は電話の前に処分されているようですが、このコードに必ずしも問題があるわけではありません。

id<MyDelegateProtocol> delegateまた、ベアIDを使用する代わりに、次のようにパラメータにプロトコル実装を適用できます。

于 2009-10-05T20:00:59.037 に答える
-1

Obj-Cのすべてのオブジェクトはタイプ(obj-cオブジェクトを掘り下げる)であるため、問題の原因となるタイプstructobjc_objectを指すデリゲートポインタは混乱を招きます。

struct objc_object
{
    struct objc_class *isa;
    /* extra stuff */
};

*isaはクラスを指します。あるクラス。したがって、デリゲートとして設定しているオブジェクトが存在しないか、不良メモリを指している可能性があります。

于 2009-10-05T20:36:26.343 に答える