【问题标题】:Pointer to Error-Pointer in Objective-CObjective-C 中指向错误指针的指针
【发布时间】:2014-04-12 00:50:27
【问题描述】:

对不起,如果发现很多类似的线程,但它们不是关于这个错误**的东西。

我尝试像我发现的错误示例那样“设计”我的方法。但是调用第二个,错误不是指向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];

我想,我用sendSynchronousRequest...做了和苹果一样的事。他们的评论告诉我们

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

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

【问题讨论】:

  • 你如何在调试器中打印error?

标签: objective-c pointers error-handling


【解决方案1】:

代码没问题,error 不需要“从外部”初始化。

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

NSError *error;

与

没有什么不同
NSError *error = nil;

在 ARC 下。

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

话虽如此,

摘要字符串解析错误

是 lldb 错误。我的假设是它会被双指针混淆,但我不会太担心。

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

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

【讨论】:

  • 在非弧下也可以..错误可能不是零。那完全没问题。 LLDB 然后显然无法显示它,但那不是真正的问题
  • 谢谢,所以我不必询问调试器信息。支票是我的问题(见 Leo Natan 的回答)。
  • @Daij-Djan 在非 ARC 下,如果 error 变量没有归零,你将无法判断是发生错误还是存在垃圾值。
  • @LeoNatan:检查错误对象以确定成功与Cocoa convention相反。应该使用直接返回值,并且仅在失败时检查错误。
【解决方案2】:

记得将refresh中的指针设置为nil:

NSError *error = nil;

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

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

【讨论】:

  • ARC下的error会自动初始化为nil。
  • @GabrielePetronella 你确定吗?如果我没记错的话,只有实例变量被初始化。我们在未初始化的错误指针方面遇到了一些问题,这是在移至 ARC 之后发生的。
  • 给你:stackoverflow.com/questions/10022025/…。无论如何仍然是一个很好的做法,但这不是 ARC 下任何问题的原因。
  • 好的,ErrorBlock 是另一种选择。但是由于我有一些更深层次的方法堆栈,所以无论如何我都应该正确测试 *error。谢谢
  • @Sammy 检查错误不是应用此模式的正确方法。您应该有方法返回一个BOOL 指示计算是否成功并检查返回值。甚至某些 Apple API 也可能会失败,但会返回 nil 错误,因此请避免这样做!
猜你喜欢
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多