【问题标题】:ios app crash on startupios应用程序在启动时崩溃
【发布时间】:2014-11-27 01:57:53
【问题描述】:

我开始为我的 iphone 应用程序使用 crashlytics,它似乎在启动过程中对某些用户崩溃(或者我猜是启动)。这是堆栈跟踪:

Fatal Exception: NSInvalidArgumentException
-[NSNull rangeOfCharacterFromSet:]: unrecognized selector sent to instance 0x19687eba0
Thread : Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x00000001854aa59c __exceptionPreprocess + 132
1  libobjc.A.dylib                0x0000000195bfc0e4 objc_exception_throw + 60
2  CoreFoundation                 0x00000001854b1664 __methodDescriptionForSelector
3  CoreFoundation                 0x00000001854ae418 ___forwarding___ + 928
4  CoreFoundation                 0x00000001853b2b6c _CF_forwarding_prep_0 + 92
5  UIKit                          0x0000000189fc38a0 -[UILabel _contentInsetsFromFonts] +    104
6  UIKit                          0x000000018a13ac90 -[_UILabelLayer updateContentInsets] + 76
7  UIKit                          0x000000018a13ad50 -[_UILabelLayer updateContentLayerSize] + 56
8  UIKit                          0x000000018a13ae34 -[_UILabelLayer layoutSublayers] + 36
9  QuartzCore                     0x00000001895ac564    CA::Layer::layout_if_needed(CA::Transaction*) + 320
10 QuartzCore                     0x00000001895ac408 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 32
11 QuartzCore                     0x00000001895abc08 CA::Context::commit_transaction(CA::Transaction*) + 276
12 QuartzCore                     0x00000001895ab98c CA::Transaction::commit() + 436
13 QuartzCore                     0x00000001895a53bc CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 80
14 CoreFoundation                 0x0000000185462a50 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
15 CoreFoundation                 0x000000018545f9dc __CFRunLoopDoObservers + 360
16 CoreFoundation                 0x000000018545fdbc __CFRunLoopRun + 836
17 CoreFoundation                 0x000000018538d0a4 CFRunLoopRunSpecific + 396
18 GraphicsServices               0x000000018e52f5a4 GSEventRunModal + 168
19 UIKit                          0x0000000189cc23c0 UIApplicationMain + 1488
20 partybutton                    0x00000001000d6de0 main (main.m:16)
21 libdyld.dylib                  0x000000019626aa08 start + 4

不太确定如何调试它,因为我无法自行重现。有什么指点吗?

【问题讨论】:

  • NSNull 很有趣。你的代码有没有实际使用过 NSNull ?
  • 我只是将它用于我的应用程序中的比较目的。我注意到谷歌分析确实使用 NsNull 做了一些事情,但我只是从快速 grep 中注意到...并没有深入研究它。
  • 嗯,看起来有点像你正在崩溃,因为字体是由 NSNull 表示的。您是否使用可能不在用户设备上的奇怪字体?您是否制作了一些进入标签的初始属性字符串?现在我们已经完成了我的猜测! :)
  • 有趣的想法。我不确定从哪里开始寻找,因为堆栈跟踪中没有显示视图控制器。你知道为什么会这样吗?
  • 检查您是否从服务器获取 JSON 数据并将其直接设置为 UILabel 的文本。您假设它是NSString,但对于某些用户,服务器会在该字段中发送null。因此 JSON 解析器创建了一个 NSNull 并且您会看到指定的行为。

标签: ios crash crashlytics


【解决方案1】:

我有类似的问题。来自服务器的 JSON 响应包含 NULL/null。像这样的:

"result":[
    {
        "id":"44",
        "message":null,
    }]

我创建了NSNull 类的类别。然后添加了NSString引起异常的方法。

NSNull+JSON.h 文件:

#import <UIKit/UIKit.h>

@interface NSNull(JSON)

@end

NSNull+JSON.m 文件:

@implementation NSNull (JSON)

- (NSUInteger)length { return 0; }

- (NSInteger)integerValue { return 0; };

- (float)floatValue { return 0; };

- (NSString *)description { return @"0(NSNull)"; }

- (NSArray *)componentsSeparatedByString:(NSString *)separator { return @[]; }

- (id)objectForKey:(id)key { return nil; }

- (BOOL)boolValue { return NO; }

- (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)aSet{
    NSRange nullRange = {NSNotFound, 0};
    return nullRange;
}

//add methods of NSString if needed

@end

通过这样做,我不必检查每个变量中的 NULL。

【讨论】:

  • 太棒了。 .它拯救了我的一天。 .竖起大拇指。
  • 我已经创建了这个类,但不明白如何使用它?
  • @ios developer :编写类后,您的 null 崩溃应该得到解决。你会得到客观 c 友好的零。这不会导致您的应用程序崩溃。希望对您有所帮助
  • 我的应用程序仍然崩溃。
  • [NSNull rangeOfCharacterFromSet:]无法识别的选择器发送到实例
【解决方案2】:

对于我来说,它是从服务响应的JSON数据包含NULL字符串,Json解析将其视为字符串,但iOS系统没有。

【讨论】:

    【解决方案3】:

    kazi.munshimun,您可以使用 NSDictionary 扩展类来执行此操作。它会自动检查 NULL 字段。

    GitHub: NSDictionary extension class

    【讨论】:

      【解决方案4】:

      在我的例子中,[NSNull rangeOfCharacterFromSet:] 错误与一个空的用户定义的运行时属性有关,我的一个视图控制器需要与第三方自定义导航控制器一起使用

      【讨论】:

        【解决方案5】:

        IOS 不会将 NULL 视为 nil,并且在运行时它会崩溃。 要克服这个问题,只需将您的 json 字符串与 NSNULL 进行比较,然后分配给字符串变量

        NSString *yourVariable = ([stringVariable isEqual:[NSNull null]]) ? @"" : 字符串变量;

        【讨论】:

          【解决方案6】:

          简单的方法是检查 NSString *city= set value from json ; 例如

          然后进行检查-->

          NSString *city=[responseDictionaryForEachRow     valueForKey:@"City"];
          if (![city isKindOfClass:[NSNull class]]){
              @"Your code if string is not null";`
          }
          

          【讨论】:

          • 这和这个问题到底有什么关系?
          猜你喜欢
          • 2018-12-27
          • 1970-01-01
          • 1970-01-01
          • 2012-01-17
          • 1970-01-01
          相关资源
          最近更新 更多