4

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

-(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。前三个被发送成为 NSArray,最后一个已经是 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(去掉最后一个 else if,把它留作 else),但这对我来说似乎很草率.

有人知道我该如何处理吗?

谢谢,-k。

4

3 回答 3

8

您可以尝试使用isKindOfClass:而不是isMemberOfClass:.

第一个将为您发送的类的实例或其子类的对象返回 YES,因为它可能是NSCFArray.

于 2009-09-17T13:36:27.357 回答
3

值得考虑的两种可能性:

于 2009-09-17T13:41:10.093 回答
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;
} 
于 2009-09-17T13:37:02.047 回答