当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么我必须最后调用super-dealloc,而不是先调用?》经验,为你挑选了3个好方法。

正确的例子:

- (void)dealloc {
    [viewController release];
    [window release];
    [super dealloc];
}

错误的例子:

- (void)dealloc {
    [super dealloc];
    [viewController release];
    [window release];
}

在覆盖一个方法的过程中几乎所有其他情况下我首先会调用super的方法实现,在这种情况下,apple总是在最后调用[super dealloc].为什么?



1> cocoafan..:

它只是一个指导方针.您可以在之后拨打其他说明[super dealloc].但是你不能再访问超类的变量,因为它们在你调用时被释放了[super dealloc].在最后一行调用超类总是安全的.

如果它们依赖于已经释放的成员变量,KVO和依赖(触发)键也会产生副作用.


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

2> n3rd..:

我对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();
        }
    }
}

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


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

3> Terry Wilcox..:

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

看到这个答案.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有