ios 检查空对象

Posted

技术标签:

【中文标题】ios 检查空对象【英文标题】:ios checking for an empty object 【发布时间】:2012-06-04 17:22:52 【问题描述】:

我通过引用我在网上找到的一些代码传递了一个错误。错误以空对象的形式返回,这意味着没有错误。

如果我检查error.code,我会得到一个错误的访问权限,因为对象是空的。

如果我检查error == nil,我会得到一个false,因为error 是一个空对象。

如何使用逻辑发现错误存在,但为空?

【问题讨论】:

您误诊了问题。没有“空对象”之类的东西。我怀疑您没有正确检查是否成功并且正在取消引用一个悬空指针。发布您正在使用的代码,也许有人可以提供帮助。 【参考方案1】:

错误通常是NSError 类型或其子类。它们在以这种方式声明的方法中作为引用传递:

-(void)DoSomeStuff:(NSError **)error;

因此,当您调用需要传递对 NSError 的引用的方法时,您可以这样调用它:

NSError *error = nil;
[self DoSomeStuff:&error];

当这个方法完成它的工作时,你检查错误对象是否真的被填充了一些东西:

if(error)

   //Do some stuff if there is an error.
   //To see the human readable description you can:
   NSLog(@"The error was: %@", [error localizedDescription]);
   //To see the error code you do:
   NSLog(@"The error code: %d", error.code);

else //There is no error you proceed as normal

  //Do some other stuff - no error

附:如果您没有收到错误并且该方法未按预期运行,则此方法的实现存在问题。尤其是开源的东西,很容易出现编码错误,所以你可以看看这个方法做了什么,如果有问题可以调试甚至修复......

【讨论】:

if(error) 并不是大多数 Apple API 的设计方式。大多数 Apple API 返回 BOOL 以指示是否发生错误。无法保证成功后错误指针为nil 有趣,你有没有抓到这样的案例——成功,但是错误被初始化了,反之? Apple 对 ex 的异步方法有何建议。 -(void)DoSomeStuffAsync:(void(^)(NSError *error))completionBlock,例如,我可以在哪里看到我的异步方法在某些时候失败了? 我个人没有抓到一个,因为我遵循 API 并检查返回值。 There's more details on this mistake here,包括官方文档的链接。 异步的东西似乎不会成为问题,除非它是多线程的,在这种情况下使用 @synchronized 就像任何其他多线程代码一样。

以上是关于ios 检查空对象的主要内容,如果未能解决你的问题,请参考以下文章

如何检查对象是不是处于空状态?

空对象模式

空对象模式

设计模式空对象模式

设计模式(32)-----行为型模式-----空对象设计模式

空对象模式