在[super delloc]语句之前和之后释放对象的区别?

时间:2010-10-21 07:25:46

标签: iphone objective-c

我想知道在发布[super delloc]对象之前有什么区别 释放我的线[super delloc]

之后

例如, 前..

- (void)dealloc {
    [theAudioPlayer stop];

    [soundFilePath release];

    [theAudioPlayer release];

    [super dealloc];
}

现在释放对象后..

- (void)dealloc {

    [super dealloc];

    [theAudioPlayer stop];

    [soundFilePath release];

    [theAudioPlayer release];
}

当我使用第一种情况时,我首先导航我的viewController第一个到第二个viewController类,然后再次来到第二个到第一个,然后它会在控制台后面给我一些错误。

#0  0x02d29c93 in objc_msgSend ()
#1  0x0628ae60 in ?? ()
#2  0x02b24814 in __CFURLDeallocate ()
#3  0x02b23ed0 in _CFRelease ()
#4  0x0012af48 in -[NSURL release] ()
#5  0x02795827 in -[AVAudioPlayer dealloc] ()
#6  0x0000480e in -[ViewController dealloc] (self=0x6285340, _cmd=0x2c0a934) at /Users/ajm/Desktop/DetectiveJone/Classes/ViewController.m:209
#7  0x02d23e9d in objc_setProperty ()
#8  0x0039f7b3 in -[UINavigationController setDisappearingViewController:] ()
#9  0x0039ce91 in -[UINavigationController _clearLastOperation] ()
#10 0x0039d732 in -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] ()
#11 0x0054d25f in -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:] ()
#12 0x0054e39e in -[UINavigationTransitionView _navigationTransitionDidStop] ()
#13 0x00325d54 in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] ()
#14 0x00325be6 in -[UIViewAnimationState animationDidStop:finished:] ()
#15 0x048a1933 in run_animation_callbacks ()
#16 0x048a17da in CA::timer_callback ()
#17 0x02b497dc in CFRunLoopRunSpecific ()
#18 0x02b488a8 in CFRunLoopRunInMode ()
#19 0x0356989d in GSEventRunModal ()
#20 0x03569962 in GSEventRun ()
#21 0x00307372 in UIApplicationMain ()
#22 0x00002018 in main (argc=1, argv=0xbffff050) at /Users/ajm/Desktop/DetectiveJone/main.m:14
(gdb) 

5 个答案:

答案 0 :(得分:10)

第二种方式是绝对错误的。 NSObject的dealloc从字面上解除了对象的释放,[super dealloc]不可避免地达到NSObject的任何正确编写的Cocoa类的实现。这意味着不再分配执行dealloc方法的对象的内存,并访问曾经对象的实例变量的内存 - 甚至只是为了发送它们{{1} } - 是未定义的行为。

因此,release应始终位于方法的末尾。在该行执行后,您无法执行任何有意义的操作。

答案 1 :(得分:1)

在释放超类之前,必须释放类的对象。 这是新的反向操作。

当您调用[supper dealloc]时,您可以认为该对象不再是您的类的对象,而是超类的对象。 (我不知道我是否真的清楚......)

来自Memory Management Programming Guide

  

如果你的类拥有它拥有的对象实例变量,你必须实现一个释放它们的dealloc方法,然后调用super的实现。

答案 2 :(得分:0)

嗯,一方面可能与性能有关。想象一下,你的超类是一些你一无所知的课程。这意味着你不知道[super dealloc]可能做什么。也许它有一个数组成员,并且必须在其所有项目上调用release。如果你有多个线程并且正在锁定,假设调用[super dealloc]会很快,你可能会严重错误。

沿着这条线,最好是最后调用[super dealloc]。首先清理你负责的东西,然后关闭控制权。

至于技术原因或差异,我很好奇。

答案 3 :(得分:0)

第一种方式。

不同之处在于您的超类在您的ivars之前被拆除了,您应该假设您的成员现在也指向无效的内存。 'after'是危险的,特别是当你的ivars要销毁时,在被破坏的物体的界面中使用任何,尽管还有其他危险的情况。

注意:最好摧毁像'dealloc'之外的音频播放器。

答案 4 :(得分:0)

在释放资源时,您必须首先释放子资源,然后取消分配超级资源。

三江源 普拉萨德