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

时间:2012-02-07 00:00:03

标签: iphone objective-c memory-management exception-handling error-handling

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

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

那么......必须如何测试那些返回的对象,以了解每个调用是否都返回了正确的对象?

每次调用返回的值,对于每次调用,如果你在预期的分配对象中得到nil,则处理异常?让应用程序崩溃?

如何做到这一点?

2 个答案:

答案 0 :(得分:0)

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

如果它不是致命的,你可以继续,那就这样做。 “哎呀,那个字符串无法转换成某种编码,但那不是一个显示阻止者。”

如果您可以而且应该提供消息,请执行此操作。在某些情况下,重启可能是更安全的时间来呈现消息。

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

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

重要的是,您要了解每种方法的后果并进行适当的写作。

答案 1 :(得分:0)

每次调用返回对象的函数时,都不需要检查nil返回值。重要的是要了解函数何时更有可能返回nil对象以及对应用程序可能产生的后果。

与文件系统或网络相关的函数是您经常需要检查nil返回值的两种最常见的类型,因为这两个系统的状态通常是您无法控制的,因此您尝试的资源是访问可能不可用。如果函数也以NSError **作为参数,那么您应该检查nil返回值的一个很好的迹象。

另一方面,例如,每次创建NSString或NSArray时检查nil是不必要的,因为它返回nil的唯一原因是在测试期间是否存在某种程序员错误反正。

所以我猜我的非常一般的建议不是检查nil,如果有一个程序员错误,只有执行检查的唯一可行的方法是nil对于nil,当返回对象由于某些资源不可用(并且超出您的控制范围)而可能为零时。

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