Tha*_*nks 29 iphone cocoa-touch memory-management uikit
正确的例子:
- (void)dealloc {
[viewController release];
[window release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
错误的例子:
- (void)dealloc {
[super dealloc];
[viewController release];
[window release];
}
Run Code Online (Sandbox Code Playgroud)
在覆盖一个方法的过程中几乎所有其他情况下我首先会调用super的方法实现,在这种情况下,apple总是在最后调用[super dealloc].为什么?
coc*_*fan 54
它只是一个指导方针.您可以在之后拨打其他说明[super dealloc].但是你不能再访问超类的变量,因为它们在你调用时被释放了[super dealloc].在最后一行调用超类总是安全的.
如果它们依赖于已经释放的成员变量,KVO和依赖(触发)键也会产生副作用.
n3r*_*3rd 12
我对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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可能不会在你的代码中遇到这个问题,因为"你知道你在做什么",但这样做更安全,总体上更好.