Frage

Ich habe einen Zeiger in einer Objektiv-C-Klasse, an die ich Nachrichten senden muss. Der Zeiger kann möglicherweise alles sein, daher muss ich sicherstellen, dass er auf meine Nachrichten reagiert, bevor ich sie sende. Hier ist die Funktion, mit der ich die Überprüfung durchführt:

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

Das Problem ist, dass der Delegierte Zeiger manchmal a ist struct objc-object * Und ich bekomme eine EXC_BAD_ACCESS Fehler beim Schlechten Zugriff, wenn ich das sende isKindOfClass Botschaft.

Gibt es einen besseren Test, den ich verwenden sollte, um festzustellen, ob der Delegierte auf meine Nachrichten antwortet?

War es hilfreich?

Lösung

Es hört sich so an, als würde Ihr Delegierter vor dem Anruf entsorgt, und nicht, dass mit diesem Code etwas unbedingt falsch ist.

Außerdem können Sie eine Protokollimplementierung auf dem Parameter wie SO durchsetzen: id<MyDelegateProtocol> delegate anstatt nur eine bloße ID zu verwenden.

Andere Tipps

Warten Sie, meinst du wirklich, der Zeiger kann etwas sein? Wie ein void * Hinweis auf ein Stück roher malloc -Gedächtnis oder auf ein objc_object, das nicht aus NSObject stammt? Wenn dies wirklich der Fall ist, gibt es keine Möglichkeit, diese sicher zu machen. Es ist gleichbedeutend damit zu sagen: "Ohne Dereferenzierung dieses Zeigers kann ich wissen, dass es sicher ist, Dereference zu haben?" Der einzige Weg ist es, ein priori -Wissen zu haben, dass alles, was es in Sie übergab, Ihnen keinen schlechten Zeiger hat.

Sie können versuchen, einen Signal -Handler -Code zu schreiben, um einen exec_bad_access aufzuräumen, aber letztendlich funktioniert er langsam, schlecht und maskiert viele andere echte Fehler. Realistisch gesehen haben Sie entweder einige Einschränkungen für das, was Sie übergeben werden, oder Sie müssen diesen Teil Ihres Projekts erneut anartigen.

Der Delegierte Zeiger, der auf die Struktur von OBJC_Object zeigt, die ein Problem verursacht, ist verwirrend, da alle Objekte in OBJ-C vom Typ sind (in ein OBJ-C-Objekt graben):

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

Die *ISA verweist auf eine Klasse .. eine Klasse. Das Objekt, das Sie als Delegierter einstellen, existiert möglicherweise nicht oder verweist auf einen schlechten Speicher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top