iOS应用程序在启动时崩溃。

6

我开始在我的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来做些什么? - matt
我在我的应用程序中仅仅使用它进行比较。我注意到谷歌分析确实会处理一些NsNull的东西,但我只是从快速grep中注意到了这一点...没有深入研究它。 - Atul Bhatia
有趣的想法。我不确定从哪里开始查找,因为堆栈跟踪中没有指示视图控制器。你知道这是为什么吗? - Atul Bhatia
因为它正在进行布局。正如您所看到的,在所有代码运行完成后,它是交易提交(我在书中称之为“重新绘制时刻”)。这是独立进行的。这就是为什么您看不到任何代码的原因。 - matt
2
如果您从服务器获取JSON数据并将其直接设置为UILabel的文本,则需要检查一件事情。您可能会认为它是一个NSString,但对于某些用户,服务器在该字段中发送了null。因此,JSON解析器创建了一个NSNull,您会看到指定的行为。 - Mats
显示剩余5条评论
6个回答

15

我有类似的问题。来自服务器的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。


太棒了。它救了我的一天。点赞。 - Muhammad_Awaab
我已经创建了这个类,但是不知道如何使用它。 - ios developer
@ios开发者:编写类后,您的空指针崩溃问题应该得到解决。您将获得Objective-C友好的nil,这不会导致您的应用程序崩溃。希望这可以帮助您。 - kazi.munshimun
它仍然导致我的应用程序崩溃。 - ios developer
[NSNull rangeOfCharacterFromSet:]实例收到未识别的选择器。 - ios developer
在正确添加上述代码后,您不应该再遇到该错误。请检查您的类别类实现。 - kazi.munshimun

2

对于我的情况,这是从服务返回的JSON数据包含空字符串,JSON解析将其视为字符串,但iOS系统不会。


0

简单的方法是使用以下代码进行检查:

NSString *city= 从JSON设置值;

例如

然后进行检查 -->

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

这与问题有什么关系? - ViRuSTriNiTy

0

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

0

IOS不认为NULL和nil是一样的,在运行时会导致崩溃。为了解决这个问题,只需要将你的json字符串与NSNULL进行比较,然后赋值给字符串变量。

NSString *yourVariable = ([stringVariable isEqual:[NSNull null]]) ? @"" : stringVariable;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接