Ich habe einige wirklich nervige Frage über objektive C-Blöcke aufgetreten. Lassen Sie uns sagen, dass wir ein Code wie dieses:Objective C Block Deklarationen Konflikt
//Class1.h
#import <Foundation/Foundation.h>
typedef void (^Class1Callback)(BOOL bl);
@interface Class1 : NSObject { }
- (id)initWithCallback:(Class1Callback)callback;
@end
//Class2.h
#import <Foundation/Foundation.h>
typedef enum Class2Enum { Foo, Bar, FooBar } Class2Enum;
typedef void (^Class2Callback)(Class2Enum ce);
@interface Class2 : NSObject { }
- (id)initWithCallback:(Class2Callback)callback;
@end
//main.c
#import "Class1.h"
#import "Class2.h"
int main(int argc, char *argv[]) {
Class1 *class1 = [[Class1 alloc] initWithCallback:^(BOOL bl){ }];
Class2 *class2 = [[Class2 alloc] initWithCallback:^(Class2Enum ce){ }];
}
In diesem Code, den ich erhalte eine Fehlermeldung "nicht kompatibel Blockzeigertypen zu initialisieren 'void (^) (Enum Class2Enum)' erwartet 'Class1Callback'" in line
Class2 *class2 = [[Class2 alloc] initWithCallback:^(Class2Enum ce){ }];
Aber wenn ich umkehren nur die Einfuhren in main.c, dh
#import "Class2.h"
#import "Class1.h"
Fehler seinen Platz und Beschreibung ändert sich - jetzt ist es in Zeile
Class1 *class1 = [[Class1 alloc] initWithCallback:^(BOOL bl){ }];
und Beschreibung ist „nicht kompatibel Blockzeigertypen‚void (^) (BOOL)‘, erwartet‚Class2Callback‘initialisieren“
Warum die Compiler erwarten ‚Class2Callback‘, wenn die Methode der Erklärung sagt, dass der Blocktyp ist Class1Callback? Ich habe keine Ahnung, warum es passiert und wo ich suchen sollte und was ich lesen sollte, um die Antwort zu finden. Irgendwelche Vorschläge?
ich eine ähnliche Frage beantwortet haben die OP könnte genauso gut lesen möchten: http://stackoverflow.com/questions/4705567/how-do-warnings-on -undefined-Selektoren-Work-in-Ziel-c/4706071 # 4706071 –
Danke, ich habe völlig vergessen, ID in Allok Return. Was die Benennung betrifft - es war nur zum Beispiel, obwohl ich in meinem echten Code meine Init-Methoden verwenden muss, um identische Namen zu haben. –
@Alexander Im Allgemeinen ist es nicht ratsam, verschiedene Methoden mit denselben Namen (d. H. Gleicher Name/gleicher Selektor, aber unterschiedliche Rückgabe-/Argumenttypen) zu verwenden, da die Laufzeit nur eine Methodenbeschreibung für einen bestimmten Selektor enthält. Siehe die Frage, die ich in meinem ersten Kommentar verlinkt habe. –