Снижение производительности с использованием RespondsToSelector

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

Я проверяю тип данных (int, bool и т. Д.) В ответе

[[json objectForKey: @"feature_enabled"] boolValue], 

который завершает работу приложения, если узел @"feature_enabled" имеет что-либо кроме 0 или 1

чтобы обойти эту проблему, вот как я это сделаю

if ([[json objectForKey: @"feature_enabled"] respondsToSelector: @selector(boolValue)]){
          BOOL featureEnabled = [[json objectForKey: @"feature_enabled"] boolValue];
}else{
          Log Exception
}

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

Любые указатели на источники информации приветствуются!

2 ответа

Решение

Вы можете рассмотреть возможность использования isKindOfClass, который, на мой взгляд, является наилучшим:

if ([[yourDictionary objectForKey: @ "yourKey"] isKindOfClass: [NSArray class]]) {// предположить, что это массив, и обработать его}

respondsToSelector: проверяет на ноль. Он не nill, он вызывает IMP lookUpMethod(класс cls, SEL sel, инициализация BOOL, кэш BOOL, идентификатор inst), который возвращает методы из кэша IMP (используя макрос CacheLookup). Если он не найден, он пытается заполнить кэш, просматривая метод в самом классе, что включает в себя повторение операции над суперклассами. Если это не удается, он запускает механизм пересылки.

isKindOfClass: сравнивает указатели isa обоих классов. Если это не удается, он повторяется с суперклассом, который является просто полем 'super_class' в структуре objc_class.

Таким образом, правильный способ различать два объекта isKindOfClass:,

Обратите внимание, что обработка ваших данных JSON будет в разы медленнее, чем все вышеперечисленное. Отсутствие селектора не останавливает систему или что-то в этом роде.

Другие вопросы по тегам