Apple提供了崩溃日志,解释了遇到的异常和原因,如下所示:
异常类型:EXC_CRASH(SIGABRT) 异常代码:0x00000000,0x00000000 崩溃的线程:0 特定应用信息: * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSCFData dataUsingEncoding:]:无法识别的选择器发送到实例0x1b4c20'
以下是代码崩溃日志后突出显示为崩溃原因的代码行
NSXMLParser *moveParser = [[NSXMLParser alloc] initWithData:[str_response dataUsingEncoding:NSUTF8StringEncoding]];
和
[[UAirship shared] registerDeviceToken:[deviceToken dataUsingEncoding:NSUTF8StringEncoding] withAlias:myAlias];
Apple已经在iPhone 4和iPad 3G上使用iOS版本5.1审核了此应用程序,并且每次都会发生崩溃。而我们无法在任何平台上重现崩溃。 我们已尝试在iPhone4上调试,在iPhone 5.1上运行iPhone 3GS,在iOS 5.0上运行iPhone 3GS,在iOS 4.3.2下使用iPhone 3GS,但不会发生崩溃。
任何人都可以让我知道我正在使用的代码有什么问题吗?
以下是编写这些行的代码块。
NSString *str_response=(NSString *)[dic objectForKey:SuccessKey];
NSXMLParser *moveParser = [[NSXMLParser alloc] initWithData:[str_response dataUsingEncoding:NSUTF8StringEncoding]];
moveParser.delegate = self;
[moveParser parse];
[moveParser release];
和
NSString *deviceToken=[[NSUserDefaults standardUserDefaults] objectForKey:@"devToken"];
[[UAirship shared] registerDeviceToken:[deviceToken dataUsingEncoding:NSUTF8StringEncoding] withAlias:myAlias];
答案 0 :(得分:0)
它可能与plist
(用户默认容器)有关。如果未设置deviceToken
中的NIL
(空的或不存在的plist-file),则尝试注册devToken
standardUserDefaults
。尝试删除Preferences文件夹中的所有plist,您可能会重现崩溃。
要解决此问题,您应该检查deviceToken
是否为NIL
。如果不是:registerDeviceToken
,否则创建空令牌等。
答案 1 :(得分:0)
我认为,这是一个明显的内存泄漏问题@ ** deviceToken **。同意@ septi的描述。
在明确提到的异常中,'NSInvalidArgumentException',原因:' - [__ NSCFData dataUsingEncoding:]:发送无法识别的选择器,而deviceToken可能存储空值,这就是创建问题。
答案 2 :(得分:0)
由于自动释放,可能你的字符串str_response
不在内存中
NSString *str_response= ([dic objectForKey:SuccessKey] : [[NSString alloc] initWithFormat:@"%@",[dic objectForKey:SuccessKey]] autorelease] ? "" );
NSXMLParser *moveParser = [[NSXMLParser alloc] initWithData:[str_response dataUsingEncoding:NSUTF8StringEncoding]];
moveParser.delegate = self;
BOOL isParsed = [moveParser parse];
if (isParsed) {
}else {
// Parsing fail
}
[moveParser release];