iOS中正确处理dealloc方法

来源:互联网 发布:经济数据分析 编辑:程序博客网 时间:2024/05/21 22:26

当我们继承类的时候,子类实例在构造的时候顺序是先高用父类的构造方法,再调用子类的构造方法。在c/c++是如此,在objc中也是如此,在iOS开发中,我们会看到这样的代码:

1.- (void)init 
2.{ 
3.    self = [super init]; 
4.    if (self)  5.    { 
6.        //init   7.    } 
8. 
9.    return self;  10.} 
看到没,初始化的时候都是先调用父类的初始化方法,为什么呢,因为父类更老,当然是先出生了。,同样的情况可以在viewDidLoad中看到。

而销毁的时候则是相反的顺序,先销毁子类里分配的空间,再销毁父类的。如:

1.- (void)dealloc { 
2.    [companion release]; 
3.    free(myBigBlockOfMemory); 
4.    [super dealloc]; 
5.} 
为什么会是这个顺序呢?因为长江后浪推前浪,子类是继承了父类的优点,发挥了自己长外, 敌人要想消灭对方,当然是先灭最强的,都说树大招风,就是这个道理。在销毁的时候如果不按这个顺序,有时候可能会crash。如在子类中应用了:
1.[outputStream setDelegate:self]; 
2.[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

如果dealloc写这成这样就会在removeFromRunLoop的时候crash:

1.- (void)dealloc { 
2.    [super dealloc]; 
3.    if (outputStream) {  4.        [outputStream close]; 
5.        [outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] 
6.                                forMode:NSDefaultRunLoopMode]; 
7.        [outputStream release]; 
8.        outputStream = nil; 
9.    } 
10.    delegate = nil; 
11.} 
如果写成这样就ok了:
1.- (void)dealloc { 
2.    if (outputStream) {  3.        [outputStream close]; 
4.        [outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] 
5.                                forMode:NSDefaultRunLoopMode]; 
6.        [outputStream release]; 
7.        outputStream = nil; 
8.    } 
9.    delegate = nil; 
10.    [super dealloc]; // must be last!   11.} 
在xCode version:4.2.1及以前版本中开发iOS的时候,如果将super dealloc写在子类dealloc中前面的时候是不会出错的,但在xCode version4.3.2中,它会有自动检测super dealloc的功能,如果写在前面,则会crash.


本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-04/57904.htm

原创粉丝点击