Warum gibt dieser Code EXC_BAD_ACCESS (mit IMP)?

7

Dieser Code gibt mir EXC_BAD_ACCESS, warum?

%Vor%

Ich fange gerade an, IMP zu benutzen, threes versuchen .. kein Glück. Nicht sicher, warum ich den Fehler bekomme, auch .. in der Vergangenheit, als ich EXC_BAD_ACCESS bekam, wurde die Nachricht an der Konsole gedruckt, diesmal ist die Fehlerzeile markiert.

Einige Anmerkungen: ARC ist aktiviert, XCode 4.3.2, das Projekt verwendet Objective-C ++ als Standardsprache / Compiler, dieser Code steht ganz am Anfang des Projekts

Danke Jungs

    
subzero 08.06.2012, 16:56
quelle

2 Antworten

20

Sie müssen den Funktionszeiger richtig darstellen oder ARC weiß nicht, was es tun soll. IMP ist ein generischer Funktionszeiger, der eine ID, einen Selektor und eine variable Anzahl anderer, nicht definierter Argumente akzeptiert und eine ID zurückgibt. Die Methodenimplementierung, die Sie aufrufen möchten, benötigt eine ID, einen Selektor gefolgt von genau zwei ID-Parametern und einen void-Rückgabetyp. Sie können es beheben, indem Sie den folgenden Code ändern:

%Vor%

Sie sollten immer überprüfen, ob Sie tatsächlich einen Funktionszeiger zurückbekommen haben, bevor Sie ihn dereferenzieren, da dies ebenfalls zum Absturz führen würde. Der obige Code funktioniert auch in einer ARC-Umgebung. Auch wenn Sie ARC nicht verwenden, sollten Sie Ihre Funktionszeiger immer auf den tatsächlichen Prototyp statt IMP umwandeln. Sie sollten niemals IMP verwenden. Andere Orte, die zu größeren Problemen führen würden, sind, wenn die Methode eine Struktur zurückgibt oder wenn die Methode Fließkomma-Parameter usw. verwendet.

Gute Angewohnheit: Wirf deine Funktionszeiger immer auf oder mache typedefs für sie, wenn du die Funktion Pointer-Syntax jarring findest.

    
Jason Coco 08.06.2012, 17:26
quelle
1

Das Problem ist, dass IMP den Rückgabetyp "ID" hat, den ARC zu verwalten versucht. Sie müssen Ihren Funktionszeiger so konvertieren, dass er den Rückgabetyp "void" (entspricht der von Ihnen aufgerufenen Methode) enthält:

%Vor%     
Tom Pelaia 08.06.2012 17:36
quelle