好的,所以这个iOS8开始引起很多问题,这就是其中之一。

我正在使用NullSafe库(可以在github上找到),该库在解析空内容时基本上返回nil而不是异常。

现在,当NullSafe工作时,它只需浏览所有类(从您项目中的每个框架/ bundle /套件)。对于这个Nullsafe库为什么会那样做,我并没有真正的信心,但是确实做到了,现在崩溃了。

调试时,崩溃时要检查的类有所不同,但是我们永远无法在apple doc或 bundle 软件中的任何地方找到它。所以我的结论是:

似乎NullSafe正在尝试浏览不存在的类

  • 我真的不能摆脱NullSafe,或者至少我想尝试不
    暂时。
  • 它总是在与 View 相关的 View 上崩溃
    类。
  • 当我们寻找它们时,它们似乎从未存在过。

  • 你们中有人使用NullSafe还是对此有所了解,所以我们可以尝试前进吗?

    最佳答案

    与尼克(Nullsafe的制造商)联系后,我发现我的问题消失了。他只是给了我最新版本1.2.1。

    这是完整的Nullsafe.m文件:

    //
    //  NullSafe.m
    //
    //  Version 1.2.1
    //
    //  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 NSMutableArray *classList = nil;
                static NSMutableDictionary *signatureCache = nil;
                if (signatureCache == nil)
                {
                    classList = [[NSMutableArray 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];
                            }
                            Class next = class_getSuperclass(superclass);
                            [excluded addObject:NSStringFromClass(superclass)];
                            superclass = next;
                        }
                    }
    
                    //remove all classes that have subclasses
                    for (Class someClass in [classList reverseObjectEnumerator])
                    {
                        if ([excluded containsObject:NSStringFromClass(someClass)])
                        {
                            [classList removeObject:someClass];
                        }
                    }
    
                    //free class list
                    free(classes);
                }
    
                //check implementation cache first
                NSString *selectorString = NSStringFromSelector(selector);
                signature = [signatureCache objectForKey:selectorString];
                if (!signature)
                {
                    //find implementation
                    for (Class someClass in classList)
                    {
                        if ([someClass instancesRespondToSelector:selector])
                        {
                            signature = [someClass instanceMethodSignatureForSelector:selector];
                            break;
                        }
                    }
    
                    //cache for next time
                    [signatureCache setObject:signature ?: [NSNull null] forKey:selectorString];
                }
                else if ([signature isKindOfClass:[NSNull class]])
                {
                    signature = nil;
                }
            }
            return signature;
        }
    }
    
    - (void)forwardInvocation:(NSInvocation *)invocation
    {
        [invocation invokeWithTarget:nil];
    }
    
    #endif
    
    @end
    

    希望这可以帮助 :)

    关于ios - 自iOS8起,NullSafe在UIKit/Webkit/UIWebViewPDF/UIWebView/UIWebDocumentView/上崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25969633/

    10-12 07:40