Как правильно обращаться с указателями 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
в других?
Как правильно передать ошибку между методами и проверить, произошла ли ошибка?