传递时NSArray成为NSCFArray

Kev*_*ers 4 iphone cocoa-touch objective-c 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];
Run Code Online (Sandbox Code Playgroud)

}

这里有四件事之一:Look,Use,Exit或NSArray.前三个被送去成为NSArrays,最后一个已经是NSArray.

现在,当我从其他地方传递NSArray时,就像这样:

    NSArray *myAction = [[NSArray alloc] initWithObjects:myAction1, myAction2, nil];
[controller performAction:myAction withItem:nil];
Run Code Online (Sandbox Code Playgroud)

...从不调用自定义操作,因为它将myAction读作NSCFArray而不是NSArray.当我尝试[myAction isMemberOfClass:[NSCFArray class]]时,它无法识别CF. 让它在当下工作的简单方法就是假设任何不是Look,Use或Exit的东西都是NSArray(除去最后的其他内容,只是把它留作别的东西),但这对我来说似乎很草率.

谁知道我怎么处理这个?

谢谢,-k.

pgb*_*pgb 8

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

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

  • 我认为重要的是要注意`NSArray`,`NSString`和许多其他类是_class clusters_.这意味着您永远不会获得指定类的对象,但始终是私有子类.而不是`NSArray`你将永远得到一个`NSCFArray`,它是`NSArray`的子类,也是来自Core Foundation _的`CFArrayRef`类型的直通桥 - (Cocoa下面的一个低层框架)不是Objective-C)_. (4认同)