由于崩溃而没有复制,Apple拒绝了应用程序

时间:2012-04-27 08:11:24

标签: iphone nsdata unrecognized-selector

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];

3 个答案:

答案 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];