2014-09-22 22 views
0

好吧,所以這個iOS8開始導致很多問題,這就是其中之一。NullSafe崩潰UIKit/Webkit/UIWebViewPDF/UIWebView/UIWebDocumentView/...自iOS8以來

我正在使用NullSafe庫(在github上可以找到),它基本上在解析空的時候返回nil而不是異常。

現在,當NullSafe正在工作時,它只是瀏覽所有類(從項目中的每個框架/包/套件)。我對這個Nullsafe圖書館爲什麼這樣做的理解並不是很有信心,但它確實如此,現在它崩潰了。

調試時,被撞擊時變化檢查類,但我們從來沒有在蘋果文檔或束的任何地方找到它...所以我的結論是:

看來,NullSafe試圖瀏覽不存在

  • 我真的不能擺脫NullSafe的,或者至少我想不 嘗試暫時類。
  • 它總是出現在與視圖相關的 類中。
  • 當我們尋找它們時,它們似乎永遠不存在。

你們有沒有使用NullSafe或知道任何事情,所以我們可以嘗試前進?

回答

0

聯繫Nick(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 

希望這有助於:)

相關問題