【问题标题】:Why does [[NSError alloc] init]; in Xcode throw an error?为什么 [[NSError alloc] init];在 Xcode 中抛出错误?
【发布时间】:2016-02-16 15:30:22
【问题描述】:

我在 Xcode 中有以下代码:

NSError *error = [[NSError alloc] init];
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

它会在日志中引发以下错误

[NSError init] called; this results in an invalid NSError instance. It will raise an exception in a future release. Please call errorWithDomain:code:userInfo: or initWithDomain:code:userInfo:. This message shown only once.

也许,你会告诉我答案在日志中,但我不明白如何初始化 NSError。

【问题讨论】:

  • 因为 sendSynchronousRequest 会自己分配错误。这就是为什么你只给出一个指向错误(*)的指针。所以你创建的 Instanz 将永远不会被使用并且是无效的。

标签: ios nserror alloc


【解决方案1】:

您不能通过-init 创建NSError 实例;请改用-initWithDomain:code:userInfo: 或构造方法+errorWithDomain:code:userInfo:

在您的情况下,无论如何它都是多余的,因为该方法会在出错的情况下创建它。

这是使用它的正常模式:

NSError *error = nil;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request
                                      returningResponse:&response
                                                  error:&error];
if (!urlData) {
    NSLog(@"Error: %@", [error localizedDescription]);
    return NO;
}

// Successful

【讨论】:

  • 我想你的意思是 nil 不是 nul,
【解决方案2】:

想想你在做什么。您应该通过将其设置为 nil 来初始化 NSError* 变量。您甚至不必这样做,编译器会为您完成。通过创建一个新的 NSError 对象来初始化它是无稽之谈。和初学者写的时候经常看到的一样的废话

NSArray* array = [[NSArray alloc] init];
array = ...;

在 NSError 的情况下,Cocoa 正确地告诉你创建一个没有任何错误信息的 NSError 对象是无稽之谈,因此是一个错误。但是没有丝毫需要这样做。实际上,它会打破您在检查错误 == nil 时错过的行。

【讨论】:

  • 您不应该检查if (error != nil) { ... } 的错误。您应该检查方法的返回值,然后使用error
【解决方案3】:

我解决了它替换:

NSError *error = [[NSError alloc]init];

NSError *error = nil;

【讨论】:

    【解决方案4】:

    日志本身表明您应该使用errorWithDomain:code:userInfo:initWithDomain:code:userInfo: 来解决此问题。

    不建议使用-[NSError init],它可能会在以后的版本中导致异常。

    示例:

        NSError *errMsg = [NSError errorWithDomain:@"domain" code:1001 userInfo:@{  
                          NSLocalizedDescriptionKey:@"Localised details here" }];
    

    【讨论】:

      【解决方案5】:

      在 Swift 中

      我解决了这个问题

       let error : NSError? = nil
      

      【讨论】:

      • 这永远不会起作用:使用let 声明的可选选项无法更改其值。无论如何,问题中的问题不适用于 Swift,方法签名是不同的。这个答案是错误的,离题了。
      【解决方案6】:

      在 Swift 中为 NSError 使用以下代码

      let error = NSError(domain: "", code: 101, userInfo: [ NSLocalizedDescriptionKey: "error in download"])
      

      并使用此错误

        print("Domain : \(error.domain)")
        print("code : \(error.code)")
        print("Description : \(error.localizedDescription)")
      

      【讨论】:

        猜你喜欢
        • 2016-10-30
        • 1970-01-01
        • 2021-12-21
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 2014-11-07
        • 1970-01-01
        • 2022-12-31
        相关资源
        最近更新 更多