NSArray wird NSCFArray wenn weitergegeben
-
10-07-2019 - |
Frage
Ich habe eine Methode, die viele verschiedene Arten von Objekten und entscheidet, was mit ihnen zu tun bekommt:
-(void)performAction:(NSObject *)myAction withItem:(Item *)myItem {
actionCount = -1;
NSLog(@"-- NEW ACTION ARRAY --");
if ([myAction isMemberOfClass:[Look class]]) {
currentActionArray = [self createLookArray:(Look *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Use class]]) {
currentActionArray = [self createUseArray:(Use *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Exit class]]) {
currentActionArray = [self createExitArray:(Exit *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[NSArray class]] ) {
NSLog(@"--- CUSTOM ACTION --- %@", myAction);
currentActionArray = (NSArray *)myAction;
}
[self performNextAction];
}
Eine von vier Dinge geht durch hierher kommen: Schauen Sie, Verwenden, Beenden oder NSArray. Die ersten drei sind abgeschickt NSArrays zu werden, der letzte ist bereits ein NSArray.
Nun, wenn ich eine NSArray in hier passieren von anderswo, wie folgt aus:
NSArray *myAction = [[NSArray alloc] initWithObjects:myAction1, myAction2, nil];
[controller performAction:myAction withItem:nil];
... die benutzerdefinierte Aktion wird nie genannt, weil es MyAction als NSCFArray eher als ein NSArray liest. Wenn ich versuche, [MyAction isMemberOfClass: [NSCFArray Klasse]] es erkennt nicht die CF. Der einfache Weg, um es zur Zeit zum Laufen zu bringen ist nur, dass irgendetwas nicht davon ausgehen, einen Blick, Verwendung oder Ausgang ist ein NSArray (erhält sonst die letzten befreien, wenn es nur als sonst verlassen), aber das scheint schlampig mir .
Wer weiß, wie ich damit umgehen kann?
Danke, -k.
Lösung
Sie können versuchen, isKindOfClass:
statt isMemberOfClass:
verwendet wird.
Die erste wird JA Rückkehr für Objekte, die entweder Instanzen der Klasse sind Sie senden, oder Subklassen davon, wie es der Fall für NSCFArray
sein kann.
Andere Tipps
Zwei Möglichkeiten eine Überlegung wert:
-
NSArray
ist ein Klasse-Cluster. Ich weiß nicht, das genaue Verhalten von-isMemberOfClass:
und-isKindOfClass:
auf Clustern. Sie können für mehr Genauigkeiten diese Frage prüfen: Ist es sicher isKindOfClass zu verwenden:? gegen eine NSString-Instanz Typen bestimmen -
Haben Sie versucht,
-isKindOfClass:
statt-isMemberOfClass:
?
NSСFArray ist Unterklasse von NSMutable Array
Sie können isKindOfClass verwenden, es zu überprüfen
if ([myAction isMemberOfClass:[Look class]]) {
currentActionArray = [self createLookArray:(Look *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Use class]]) {
currentActionArray = [self createUseArray:(Use *)myAction item:myItem];
} else if ([myAction isMemberOfClass:[Exit class]]) {
currentActionArray = [self createExitArray:(Exit *)myAction item:myItem];
} else if ([myAction isKindOfClass:[NSArray class]] ) {
NSLog(@"--- CUSTOM ACTION --- %@", myAction);
currentActionArray = (NSArray *)myAction;
}