From 83b9d5c682b21d88133f24da0f94dd56bd79e687 Mon Sep 17 00:00:00 2001 From: 单军华 Date: Thu, 19 Jul 2018 13:38:55 +0800 Subject: [PATCH] change --- screendisplay/screendisplay/Classes/Category/ThirdCategory/NullSafe.m | 134 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 134 insertions(+), 0 deletions(-) diff --git a/screendisplay/screendisplay/Classes/Category/ThirdCategory/NullSafe.m b/screendisplay/screendisplay/Classes/Category/ThirdCategory/NullSafe.m new file mode 100755 index 0000000..302568c --- /dev/null +++ b/screendisplay/screendisplay/Classes/Category/ThirdCategory/NullSafe.m @@ -0,0 +1,134 @@ +// +// NullSafe.m +// +// Version 1.2.2 +// +// Created by Nick Lockwood on 19/12/2012. +// Copyright 2012 Charcoal Design +// +// Distributed under the permissive zlib License +// Get the latest version from here: +// +// https://github.com/nicklockwood/NullSafe +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +#import <objc/runtime.h> +#import <Foundation/Foundation.h> + + +#ifndef NULLSAFE_ENABLED +#define NULLSAFE_ENABLED 1 +#endif + + +#pragma GCC diagnostic ignored "-Wgnu-conditional-omitted-operand" + + +@implementation NSNull (NullSafe) + +#if NULLSAFE_ENABLED + +- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector +{ + @synchronized([self class]) + { + //look up method signature + NSMethodSignature *signature = [super methodSignatureForSelector:selector]; + if (!signature) + { + //not supported by NSNull, search other classes + static NSMutableSet *classList = nil; + static NSMutableDictionary *signatureCache = nil; + if (signatureCache == nil) + { + classList = [[NSMutableSet alloc] init]; + signatureCache = [[NSMutableDictionary alloc] init]; + + //get class list + int numClasses = objc_getClassList(NULL, 0); + Class *classes = (Class *)malloc(sizeof(Class) * (unsigned long)numClasses); + numClasses = objc_getClassList(classes, numClasses); + + //add to list for checking + NSMutableSet *excluded = [NSMutableSet set]; + for (int i = 0; i < numClasses; i++) + { + //determine if class has a superclass + Class someClass = classes[i]; + Class superclass = class_getSuperclass(someClass); + while (superclass) + { + if (superclass == [NSObject class]) + { + [classList addObject:someClass]; + break; + } + [excluded addObject:NSStringFromClass(superclass)]; + superclass = class_getSuperclass(superclass); + } + } + + //remove all classes that have subclasses + for (Class someClass in excluded) + { + [classList removeObject:someClass]; + } + + //free class list + free(classes); + } + + //check implementation cache first + NSString *selectorString = NSStringFromSelector(selector); + signature = signatureCache[selectorString]; + if (!signature) + { + //find implementation + for (Class someClass in classList) + { + if ([someClass instancesRespondToSelector:selector]) + { + signature = [someClass instanceMethodSignatureForSelector:selector]; + break; + } + } + + //cache for next time + signatureCache[selectorString] = signature ?: [NSNull null]; + } + else if ([signature isKindOfClass:[NSNull class]]) + { + signature = nil; + } + } + return signature; + } +} + +- (void)forwardInvocation:(NSInvocation *)invocation +{ + invocation.target = nil; + [invocation invoke]; +} + +#endif + +@end -- Gitblit v1.8.0