Просмотр исходного кода

Change some private API accessors to use KVC

`performSelector:` can leak. The `KVC` methods are much safer and more reliable. If you pass it the exact method name, that will be called first, assuming there isn't a method with the same name but prefixed with `get`.
Tanner Bennett лет назад: 6
Родитель
Сommit
a91d1de9ad
2 измененных файлов с 14 добавлено и 21 удалено
  1. 4 5
      Classes/ExplorerInterface/FLEXExplorerViewController.m
  2. 10 16
      Classes/Utility/FLEXUtility.m

+ 4 - 5
Classes/ExplorerInterface/FLEXExplorerViewController.m

@@ -131,11 +131,9 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
     NSString *viewControllerSelectorString = [@[@"_vie", @"wContro", @"llerFor", @"Supported", @"Interface", @"Orientations"] componentsJoinedByString:@""];
     SEL viewControllerSelector = NSSelectorFromString(viewControllerSelectorString);
     if ([viewController respondsToSelector:viewControllerSelector]) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
-        viewController = [viewController performSelector:viewControllerSelector];
-#pragma clang diagnostic pop
+        viewController = [viewController valueForKey:viewControllerSelectorString];
     }
+    
     return viewController;
 }
 
@@ -148,7 +146,8 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
     }
     
     // The UIViewController docs state that this method must not return zero.
-    // If we weren't able to get a valid value for the supported interface orientations, default to all supported.
+    // If we weren't able to get a valid value for the supported interface
+    // orientations, default to all supported.
     if (supportedOrientations == 0) {
         supportedOrientations = UIInterfaceOrientationMaskAll;
     }

+ 10 - 16
Classes/Utility/FLEXUtility.m

@@ -48,28 +48,22 @@
 
 + (UIViewController *)viewControllerForView:(UIView *)view
 {
-    UIViewController *viewController = nil;
-    SEL viewDelSel = NSSelectorFromString(@"_viewDelegate");
-    if ([view respondsToSelector:viewDelSel]) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
-        viewController = [view performSelector:viewDelSel];
-#pragma clang diagnostic pop
+    NSString *viewDelegate = @"viewDelegate";
+    if ([view respondsToSelector:NSSelectorFromString(viewDelegate)]) {
+        return [view valueForKey:viewDelegate];
     }
-    return viewController;
+
+    return nil;
 }
 
 + (UIViewController *)viewControllerForAncestralView:(UIView *)view
 {
-    UIViewController *viewController = nil;
-    SEL viewDelSel = NSSelectorFromString([NSString stringWithFormat:@"%@ewControllerForAncestor", @"_vi"]);
-    if ([view respondsToSelector:viewDelSel]) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
-        viewController = [view performSelector:viewDelSel];
-#pragma clang diagnostic pop
+    NSString *_viewControllerForAncestor = @"_viewControllerForAncestor";
+    if ([view respondsToSelector:NSSelectorFromString(_viewControllerForAncestor)]) {
+        return [view valueForKey:_viewControllerForAncestor];
     }
-    return viewController;
+
+    return nil;
 }
 
 + (NSString *)detailDescriptionForView:(UIView *)view