我有一种方法可以接收许多不同类型的对象,并决定如何处理它们:
-(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];
}
这里有四件事之一:Look,Use,Exit或NSArray。前三个被送去成为NSArrays,最后一个已经是NSArray。
现在,当我从其他地方传递NSArray时,就像这样:
NSArray *myAction = [[NSArray alloc] initWithObjects:myAction1, myAction2, nil];
[controller performAction:myAction withItem:nil];
...永远不会调用自定义操作,因为它将myAction读作NSCFArray而不是NSArray。当我尝试[myAction isMemberOfClass:[NSCFArray class]]时,它无法识别CF.让它在当下工作的简单方法就是假设任何不是Look,Use或Exit的东西都是NSArray(除去最后的其他if,然后把它留作别的东西),但这对我来说似乎很草率。
任何人都知道如何解决这个问题?
谢谢, -k。
答案 0 :(得分:8)
您可以尝试使用isKindOfClass:
代替isMemberOfClass:
。
对于作为您发送的类的实例或其子类的对象,第一个将返回YES,因为NSCFArray
可能就是这种情况。
答案 1 :(得分:3)
值得考虑的两种可能性:
NSArray
是一个类集群。我不知道-isMemberOfClass:
和-isKindOfClass:
在群集上的确切行为。您可以查看此问题以获得更多精确度:Is it safe to use isKindOfClass: against an NSString instance to determine type?
您是否尝试过-isKindOfClass:
代替-isMemberOfClass:
?
答案 2 :(得分:2)
NSСFArray是NSMutable Array的子类
您可以使用isKindOfClass进行检查
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;
}