正确的例子:
- (void)dealloc { [viewController release]; [window release]; [super dealloc]; }
错误的例子:
- (void)dealloc { [super dealloc]; [viewController release]; [window release]; }
在覆盖一个方法的过程中几乎所有其他情况下我首先会调用super的方法实现,在这种情况下,apple总是在最后调用[super dealloc].为什么?
它只是一个指导方针.您可以在之后拨打其他说明[super dealloc]
.但是你不能再访问超类的变量,因为它们在你调用时被释放了[super dealloc]
.在最后一行调用超类总是安全的.
如果它们依赖于已经释放的成员变量,KVO和依赖(触发)键也会产生副作用.
我对iPhone的编程一无所知,但我认为这是因为需要以相反的顺序调用析构函数.在调用超类之前,您需要确保清除所有"垃圾".如果你这样做,事情的其他方式会变得混乱.例如,如果析构函数需要访问超级析构函数已释放的内存:
class X { private Map foo; function __construct() { foo = new Map(); } function __destruct() { foo.free; } } class Y extends X { function __construct() { super.__construct(); map.put("foo", 42); } function __destruct() { super.__destruct(); if (map.containsKey("foo")) { // boooooooooom! doSomething(); } } }
你可能不会在你的代码中遇到这个问题,因为"你知道你在做什么",但这样做更安全,总体上更好.
[super dealloc]释放对象使用的内存,包括viewController和window的指针.在释放它们之后参考变量充其量是危险的.
看到这个答案.