NSArray становится NSCFArray при прохождении - PullRequest
4 голосов
/ 17 сентября 2009

У меня есть метод, который получает много разных типов объектов и решает, что с ними делать:

-(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 (избавьтесь от последнего, если, и просто оставьте это как-то еще), но мне это кажется небрежным ,

Кто-нибудь знает, как я могу справиться с этим?

Спасибо, -k.

Ответы [ 3 ]

8 голосов
/ 17 сентября 2009

Вы можете попробовать использовать isKindOfClass: вместо isMemberOfClass:.

Первый вернет YES для объектов, которые являются экземплярами класса, который вы отправляете, или его подклассами, как это может быть в случае NSCFArray.

3 голосов
/ 17 сентября 2009

Две возможности, которые стоит рассмотреть:

2 голосов
/ 17 сентября 2009

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;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...