为什么我必须最后调用super -dealloc,而不是先调用?

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和依赖(触发)键也会产生副作用.

  • 使用ARC,你根本不需要调用`[super dealloc]`,它会产生编译错误. (6认同)

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)

你可能不会在你的代码中遇到这个问题,因为"你知道你在做什么",但这样做更安全,总体上更好.

  • 任何人都在关注为什么这个被投票? (4认同)
  • 如果问题确实是我所假设的一般性问题,那就完全无关紧要了.如果你想知道为什么对"null对象"的方法调用是一个坏主意,那么如果你在谈论Java,PHP,C++或JavaScript并不重要. (3认同)
  • 我没有贬低它; 这是一个很好的答案.然而,downvote是公平的,因为它是一个猜测,不是Cocoa框架特有的. (2认同)

Ter*_*cox 5

[super dealloc]释放对象使用的内存,包括viewController和window的指针.在释放它们之后参考变量充其量是危险的.

看到这个答案.