在Xcode中为什么使用[[NSError alloc] init];会抛出一个错误?

7

我在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将自己分配错误,所以你只需要给出一个指向错误的指针(*)。因此,您创建的实例将永远不会被使用并且无效。 - Thallius
6个回答

13
您不允许通过 -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

1
我想你是指 nil 而不是 nul。 - Ludo

1

我用以下内容替换解决了它:

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

NSError *error = nil;

1

想一想你在做什么。你应该通过将NSError*变量设置为nil来初始化它。你甚至不需要这样做,编译器会为你做这件事。通过创建一个新的NSError对象来初始化它是无意义的。这与初学者写的常见错误相同。

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

在NSError的情况下,Cocoa正确地告诉你,创建一个没有任何错误信息的NSError对象是荒谬的,因此是一个bug。但实际上,这样做毫无必要。事实上,这会破坏你错过的一行代码,其中你检查了error是否为nil。

你不应该使用 if (error != nil) { ... } 来检查错误。你应该检查方法的返回值,然后使用 error - trojanfoe

0
使用以下代码处理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)")

0
日志本身指出您应该使用errorWithDomain:code:userInfo:initWithDomain:code:userInfo:来解决此问题。
不建议使用-[NSError init],因为它可能在未来的版本中引发异常。

Screenshot for warning

Screenshot for usage 1

Screenshot for usage 2

例子:

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

-1

使用 Swift

我解决了这个问题

 let error : NSError? = nil

这永远不会起作用:使用let声明的可选项无法更改其值。而且,问题中提到的问题并不适用于Swift,方法签名是不同的。这个答案是错误的和离题的。 - Eric Aya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接