iPhone-如何测试每次内存调用返回的已分配对象



在编写应用程序时,您必须始终编写alloc/inits,获取框架类返回的自动释放数据。。。

这可能是70%的代码,几乎是你写的每一行。。。

所以。。。必须如何测试这些返回的对象,才能知道这些调用中的每一个是否都返回了正确的对象?

为每次调用测试返回值,如果在期望分配对象的位置得到nil,则处理异常?让应用程序崩溃?

必须如何做到这一点?

如果它是致命的,只需中止--考虑为这种情况提供自定义错误处理程序,以便信息可以帮助您诊断问题。

如果它不是致命的,并且你可以继续,那么就这样做。"哦,那个字符串不能转换成某种编码,但这不是一个停止。"。

如果您可以也应该显示消息,请这样做。在某些情况下,重新启动可能是显示消息的更安全时间。

Cocoa中的异常——捕获并处理您必须处理的内容,但Cocoa异常通常是"不可恢复的"。C++异常是可以的,但如果您使用ObjC和C++,则使用它们可能不会太远。最简单的问题是,不能保证异常安全地跨越图像边界——ObjC异常是C++异常(在OS X 64位和iOS中)。

错误参数是另一种方法。我相信你已经看到了::(NSError**)outError

重要的是,你要理解每种方法的后果,并适当地写作。

没有必要每次调用返回对象的函数时都检查零返回值。重要的是要了解函数何时更有可能返回nil对象,以及对应用程序的影响。

与文件系统或网络相关的函数是两种最常见的类型,您经常需要检查零返回值,因为这两个系统的状态通常超出您的控制范围,因此您试图访问的资源可能不可用。如果函数还将NSError **作为参数,则可以很好地指示您应该检查nil返回值。

另一方面,例如,每次创建NSString或NSArray时检查nil是不必要的,因为它返回nil的唯一原因是,如果在测试过程中出现了某种程序员错误,那么无论如何都应该捕捉到。

因此,我想我的非常一般的建议是,当唯一可行的方法是如果存在程序员错误时,不要检查nil,但当返回对象是由于某些资源不可用(并且超出您的控制范围)而可能为nil时,要检查nil。

还要记住,在Objective-C中,对nil的消息是可以的,这也消除了在某些情况下进行大量nil测试的需要。

最新更新