NSError 奇怪的问题 - 尝试访问 NSError 的属性时应用程序崩溃

Posted

技术标签:

【中文标题】NSError 奇怪的问题 - 尝试访问 NSError 的属性时应用程序崩溃【英文标题】:NSError strange issue - app crashes while trying to access NSError's properties 【发布时间】:2013-05-15 07:26:54 【问题描述】:

在下面的代码中NSError实例化(匹配是GameCenter的GKMatch):

    ...
    NSString * deviceID = appDelegate.deviceID;
    MessageWithDeviceID message;
    message.message.messageType = kMessageTypeDeviceID;
    const char* const deviceIDAsUTF8 = deviceID.UTF8String;
    for (size_t idx=0;idx<32;idx++)
        message.deviceID[idx] = deviceIDAsUTF8[idx];

    NSData *data = [NSData dataWithBytes:&message length:sizeof(message)];
    NSError * error;
    [match sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable error:&error];

    data  = nil;
    if (error) 
    NSLog(@"An error is occured: %@",error);
    ...

但应用程序在显示的最后一行以EXC_BAD_ACCESSSIGABRT -[NSCFString userInfo (or domain, localizedDescription, code etc)] unrecognized selector sent to instance 0x... 崩溃。所以我可以看到错误不是零,它是实例化的对象,但我无法从中获取任何信息。我试图得到以下内容:

[error localizedDescription];
[error domain];
[error code];
[error description];
etc.

但无论我尝试获取哪些信息,应用程序仍然会在 NSLog 行崩溃。我知道这种方法不正确,我需要在行中使用BOOL 变量来发送数据,但这不是问题所在。问题是NSError 对象有什么问题?我可以在调试器中看到错误字段(那些可扩展的信息),例如:

NSObject       NSObject
void *         _reserved
NSInteger      _code        875902004  Summary
NSString *     _domain
NSDictionary * _userInfo

所以看起来错误对象确实包含所有信息但无法访问......为什么会这样? NSError 是否以某种方式没有完全/完全实例化或其他什么?

【问题讨论】:

试试NSError* error = nil; 正如您自己所说:您的方法不对。您应该检查方法的返回值。如果它返回NO,则错误变量将包含描述问题的有效对象。 但这并不能解释问题。 【参考方案1】:

尝试将错误指针初始化为 nil

NSError * error = nil;

因为没有错误并且您的指针包含一个随机地址,所以您遇到了崩溃。

【讨论】:

更快但时间相同不知道谁是第一? :) +1 您在问题下方的评论比我的回答快:) 嗯,我发表了评论,但没有回复,我也添加了答案,但你也有。祝你好运 但这无济于事(但是 EXC_BAD_ACCESS 已修复)。我仍然收到 -[NSCFString userInfo (or domain、localizedDescription、code etc)] unrecognized selector sent to instance 0x... 就像错误不是 NSError 实例一样。 您的指针似乎指向 NSString 的一个实例。是否以任何其他方式操作错误指针?【参考方案2】:

替换此行。

NSError* error = nil;

【讨论】:

但这无济于事(但是 EXC_BAD_ACCESS 已修复)。我仍然收到 -[NSCFString userInfo (or domain、localizedDescription、code etc)] 无法识别的选择器发送到实例 0x...

以上是关于NSError 奇怪的问题 - 尝试访问 NSError 的属性时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.1:自定义错误转换为 NSError 以访问其域属性时崩溃

NSString 失败,应用程序崩溃尝试 NSLog NSError

iOS 8 JavaScriptCore:您将 JavaScript 文件放在哪里?

无效的 NSError 实例

AFNetworking 在 NSError 对象中返回响应

finmasket præsenterer vandtæt forsvar med ud begrænser