NSArray становится NSCFArray при передаче
-
10-07-2019 - |
Вопрос
У меня есть метод, который получает много различных типов объектов и решает, что с ними делать:
-(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];
}
Здесь произойдет одна из четырех вещей:Смотрите, Используйте, 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 (избавьтесь от последнего else if и просто оставьте его как else), но мне это кажется неаккуратным.
Кто-нибудь знает, как я могу с этим справиться?
Спасибо, -к.
Решение
Вы можете попробовать использовать isKindOfClass:
вместо того , чтобы isMemberOfClass:
.
Первый вернет YES для объектов, которые являются либо экземплярами отправляемого вами класса, либо его подклассами, как это может быть в случае NSCFArray
.
Другие советы
Две возможности, которые стоит рассмотреть:
NSArray
является классовым кластером.Я не знаю точного поведения-isMemberOfClass:
и-isKindOfClass:
на кластерах.вы можете проверить этот вопрос для получения более подробной информации: Безопасно ли использовать isKindOfClass:против экземпляра NSString для определения типа?Вы пробовали
-isKindOfClass:
вместо того , чтобы-isMemberOfClass:
?
NSCFArray является подклассом массива NSMutable
Вы можете использовать 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;
}