可以重用相同的NSError对象会有问题吗?

时间:2014-08-28 21:37:28

标签: ios objective-c iphone reference nserror

我已经将我的实现改为而不是这样做了,但我有兴趣知道以下是否会导致问题 - 例如,一个包含多个步骤的流程,每个步骤都涉及到对NSError对象的引用。如果您在此过程中的每一步都重复使用此错误对象,那么该引用是否会以某种方式受到负面影响,可能会导致某种内存管理/ dealloc崩溃?

示例(大部分中间代码已被省略)

    NSError *error;
    NSData *data = [NSJSONSerialization dataWithJSONObject:object options:0 error:&error];

    if (!data) {
        return error;
    }

    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    if (!responseData) {
        return error;
    }

    NSDictionary *resultDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];

    if (!resultDictionary) {
        return error;
    }

即使错误永远不会被使用"两次,意味着错误将是nil(似乎)下次将其引用传递给另一个方法时,引用是否可以在某个步骤中以某种方式实现?

编辑之前的原始代码以回应jlehr的评论:

    NSError *error;
    NSData *data = [NSJSONSerialization dataWithJSONObject:object options:0 error:&error];

    if (error) {
        return;
    }

    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    if (error) {
        return;
    }

    NSDictionary *resultDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];

    if (error) {
        return;
    }

编辑:对于稍后来到这里的人来说,jlehr所指的信息可以在这里找到:

  

在处理通过引用传递的错误时,测试很重要   方法的返回值,以查看是否发生错误,如   如上所示。不要只是测试是否设置了错误指针   指出错误。

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ErrorHandling/ErrorHandling.html

1 个答案:

答案 0 :(得分:3)

根据Apple的文档,您永远不应该检查引用返回的NSError对象。而是检查您正在调用的init...方法或工厂方法的返回值,例如:

NSError *error;
NSData *data = [NSJSONSerialization dataWithJSONObject:object options:0 error:&error];
if (data == nil) {
     // Handle failure. It's safe to use the error object here.
}

但是,您的代码似乎没有对NSError实例执行任何操作(例如,记录或显示警报),因此您只需传递NULL

NSData *data = [NSJSONSerialization dataWithJSONObject:object options:0 error:NULL];
if (data == nil) {
     // Handle failure.
}