指向Objective-C中的错误指针的指针

时间:2014-03-08 20:05:32

标签: objective-c pointers error-handling

很抱歉,如果发现很多线程,但他们不是关于这个错误** - 事情。

我尝试'设计'我的方法,就像我找到的错误示例。但是调用第二个,错误并没有指向nil,调试器说error: summary string parsing error

这是我的控制器方法:

-(void) refresh {
  NSError *error;
  ServerApi *serverApi = [mainModel newServerApi];
  NSArray *newItems = [serverApi getNewItems: &error];
  ...

这是被调用的方法:

- (NSArray *) getNewItems: (NSError **) error {
  // Breakpoint here, error is: 'error: summary string parsing error' 
      ...
  NSURLResponse *response;
NSData *responseData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: error];

我想,我和Apple一样sendSynchronousRequest...。他们的评论告诉

error     Out parameter (may be NULL) used if an error occurs
             while processing the request. >>>>Will not be modified if the 
             load succeeds.<<<<

我做错了什么,为什么这对苹果sendSynchronousRequest...有效?

2 个答案:

答案 0 :(得分:2)

代码很好,因为error不需要“从外部”初始化。

此外,如果您使用ARC it will automatically initialize本地对象指针nil,那么

NSError *error;

没什么不同
NSError *error = nil;
ARC下

虽然显式初始化仍然是一种很好的做法,但这不是任何错误的来源。

话虽如此,

  

摘要字符串解析错误

lldb错误。我的假设是它被双指针搞糊涂了,但我不会太担心。

顺便说一句,你在实现这种模式时犯了一个小错误。 可能失败的同步方法,应该返回一个BOOL值,指示计算是否成功,然后客户端将检查该值,然后检查error对象,以防它失败。

检查error对象通常是个坏主意:即使某些Apple API可能会失败并返回nil错误,所以请避免这样做!

答案 1 :(得分:1)

请记住在refresh中将指针设置为nil:

NSError *error = nil;

另外,请记住,您的支票应该是:

  • 检查(*error) nil(又名“没有传递错误”) - 操作可能成功也可能没有成功;
  • 检查error NULL(又名“没有传递NSError*指针,所以不要为它指定对象”。