NSClassFromString возвращает объект Class, который не отвечает должным образом на isSubClassOfClass - PullRequest
3 голосов
/ 15 июля 2011

У меня есть класс, который я тестирую, который использует много типов идентификации (отражения) во время выполнения, чтобы принимать решения о том, как себя вести.

В частности, я получаю Class заданного типа, используя property_getAttributes и немного магии строки.

Скажите, что проанализированный класс MyInheritedObject. Затем мне нужно проверить, наследует ли этот класс общий базовый класс MyBaseObject.

Итак, учитывая строку: «MyInheritedObject», я использую NSClassFromString для получения экземпляра класса, например:

NSString *className = @"MyInheritedObject";
Class cls = NSClassFromString(className);
BOOL isSubclass = [cls isSubclassOfClass:[MyBaseObject class]];

Это возвращает NO, что невероятно озадачивает. Если я выйду из суперкласса, похоже, он должен работать:

NSLog(@"Superclass: %@", [cls superclass]);
//logs:  Superclass: MyInheritedObject

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

Не уверен, если это связано, но это происходит от тестовой цели, поэтому рассматриваемые классы добавляются к обеим целям.

Есть идеи, что здесь происходит?

Ответы [ 3 ]

2 голосов
/ 15 июля 2011
NSString *className = @"MyInheritedObject";
Class indirectClass = NSClassFromString(className);
Class directClass = [MyInheritedObject class];
BOOL isSubclass = [indirectClass isSubclassOfClass:directClass];

Если вы сделаете это, (indirectClass == directClass)?

0 голосов
/ 07 октября 2015

У меня похожая проблема, когда тест по типу (полученный из NSClassFromString):

[type isSubclassOfClass:[AKABindingProvider class]]

завершается неудачно, и этот тест

[type isSubclassOfClass:NSClassFromString(NSStringFromClass([AKABindingProvider class]))]

завершается успешно.

В моем случае это происходит только внутри XCode, когда код запускается в ходе «Editor-> Refresh all views» в Interface Builder.При запуске в приложении проблем не возникает.Мой код является частью платформы iOS8 (и поэтому динамически связан).

Я предполагаю, что по какой-то странной причине классы, полученные из [X class], и классы, полученные с помощью NSClassFromString, не принадлежат к одной и той же иерархии наследования..

Можете ли вы проверить, что, когда оба класса получены из NSClassFromString, ваш тест будет работать?

0 голосов
/ 16 июля 2011

Я могу только предположить, что ваша иерархия классов неверна. Используя точно такой же код выше, я получаю ДА, как и следовало ожидать. Вы пытались сделать следующее:

NSLog(@"%@ %@", NSClassFromString(@"MyInheritedObject"), [MyInheritedObject class]);

Проверьте, совпадают ли выходы. Размещенный вами код в порядке, поэтому он должен быть проблемой с MyInheritedObject или MyBaseObject. Я бы дважды проверил вашу иерархию классов, а также удостоверился, что вы используете префиксы в именах классов, просто на случай, если у них возникнет конфликт имен (хотя среда выполнения должна предупредить вас об этом в консоли)

...