From dab31721a329bdcda2038ac13c379ef6bfab78e9 Mon Sep 17 00:00:00 2001 From: Nikolay Kasyanov Date: Fri, 4 Nov 2016 12:22:19 +0100 Subject: [PATCH] Improves property setter performance by avoiding NSString when possible --- Project/UISS/UISSPropertySetter.m | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Project/UISS/UISSPropertySetter.m b/Project/UISS/UISSPropertySetter.m index cd91166..f4abe42 100644 --- a/Project/UISS/UISSPropertySetter.m +++ b/Project/UISS/UISSPropertySetter.m @@ -71,13 +71,17 @@ - (SEL)findSelectorMatchingRegexp:(NSString *)regexp class:(Class unsigned int count = 0; Method *methods = class_copyMethodList(class, &count); - NSString *selectorPrefix = self.selectorPrefix; + const char *selectorPrefix = self.selectorPrefix.UTF8String; + size_t selectorPrefixLength = strlen(selectorPrefix); for (int i = 0; i < count; i++) { SEL selector = method_getName(methods[i]); - NSString *selectorString = NSStringFromSelector(selector); - if ([selectorString hasPrefix:selectorPrefix]) { // reducing the use of regular expression for performance reasons + BOOL hasPrefix = strncmp(selectorPrefix, sel_getName(selector), selectorPrefixLength) == 0; + + if (hasPrefix) { // reducing the use of NSString & regular expression for performance reasons + NSString *selectorString = NSStringFromSelector(selector); + if ([selectorString rangeOfString:regexp options:NSRegularExpressionSearch].location != NSNotFound) { // this favours selector with shorter label // the purpose of this is to pick forState: instead of forStates: