【发布时间】:2018-10-30 10:41:08
【问题描述】:
处理 NSError** 指针的正确方法是什么?
- (BOOL)handleData:(NSDictionary *)data error:(NSError **)error {
// pass the error pointer to NSJSONSerialization
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:options error:error];
// Check if NSJSONSerialization had errors
if (error) // <-- sometimes this works, sometimes it crashes...
return false;
...
return true;
}
- (void)someMethod {
NSError *error = nil;
BOOL result = [self handleData:dataDict error:&error];
if (error) {
// an error occurred
} else {
}
}
在此示例中,someMethod 将 NSError 引用传递给 handleData:error。这是通过传递指针/地址而不是对象来完成的 (...error:&error)
方法handleData:error 然后将此指针传递给dataWithJSONObject:options:error(现在没有&)。现在我想检查是否发生了错误,但正确的方法是什么?
if (error)...
// This works if error == nil. However this is not always the case.
// Sometimes error is some address (e.g. 0x600001711f70) and *error == nil
// from the start of the method (passing error to NSJSONSerialization has no
// influence on this
if (*error)...
// This works in cases where error itself is not nil, but it crashes if
// error == nil
为什么在某些情况下是 error == nil 而在其他情况下是 error != nil 而在其他情况下是 *error == nil?
在方法之间传递错误并检查是否发生错误的正确方法是什么?
【问题讨论】:
-
Sometimes error is some address (e.g. 0x600001711f70)- 嗯,呃。您将指向 NSError* 的指针传递给该方法,并将错误信息写入该方法。 -
不,正如
error != nil所解释的那样,有时在输入handleData:error之后会出现这种情况,然后将错误传递给dataWithJSONObject:options:error。即使error != nil为真,*error仍然为零...
标签: objective-c pointers nserror