传递时NSArray成为NSCFArray

时间:2009-09-17 13:22:32

标签: iphone objective-c cocoa-touch nsarray

我有一种方法可以接收许多不同类型的对象,并决定如何处理它们:

-(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。

3 个答案:

答案 0 :(得分:8)

您可以尝试使用isKindOfClass:代替isMemberOfClass:

对于作为您发送的类的实例或其子类的对象,第一个将返回YES,因为NSCFArray可能就是这种情况。

答案 1 :(得分:3)

值得考虑的两种可能性:

答案 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;
}