【问题标题】:Apple rejected app due to a crash which is not reproducing由于无法重现的崩溃,Apple 拒绝了应用程序
【发布时间】:2012-05-07 23:49:32
【问题描述】:

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 已在 iOS 5.1 版 iPhone 4 和 iPad 3G 上审查了此应用程序,每次都发生崩溃。而我们无法在任何平台上重现崩溃。 我们尝试在 iPhone4、iOS 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];

【问题讨论】:

  • 不确定是否有帮助,但这一行:-[__NSCFData dataUsingEncoding:]: unrecognized selector 建议您在已经是 NSData 对象的对象上调用“dataUsingEncoding:”。我会检查是否有某种方式可能发生这种情况。 “deviceToken”和“str_response”应该是字符串,对吧?他们被分配到哪里?他们能在某个时候成为 NSData 吗?
  • 只是一个愚蠢的问题,但它发生在我身上一次,您是否尝试使用发布版本重现此问题?
  • 是的,我已经尝试过 Adhoc/release 构建和调试构建,但无法重现。

标签: iphone nsdata unrecognized-selector


【解决方案1】:

这可能与plist(用户默认容器)有关。如果未设置standardUserDefaults 中的devToken(为空或不存在plist 文件),您尝试注册deviceToken,它可能是NIL。尝试删除 Preferences 文件夹中的所有 plist,您可能会重现崩溃。

要解决这个问题,您应该检查deviceToken 是否为NIL。如果不是:registerDeviceToken,否则创建空令牌等。

【讨论】:

  • 我尝试在设备令牌字符串和 str_response 字符串中显式传递 nil,但它没有崩溃。
【解决方案2】:

我认为,这是一个明显的内存泄漏问题@** deviceToken**。同意@septi 的描述。

在明确提到的异常中,'NSInvalidArgumentException',原因:'-[__NSCFData dataUsingEncoding:]:发送了无法识别的选择器并且 deviceToken 可能正在存储空值,这会产生问题。

【讨论】:

  • 同意 iApple 但它应该被复制。问题是我们无法重现该问题。
  • @Hassan:尝试注释掉[moveParser release];这条线可能有问题,并且不确定再次加注。
【解决方案3】:

也许你的字符串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];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    相关资源
    最近更新 更多