2010-10-21 76 views
4

我想知道的是什么释放我的[超级delloc] 的对象之前,释放我行的目的[超级delloc]在[super delloc]语句前后释放对象之间的区别?

例如, 之前之后的区别..

- (void)dealloc { 
    [theAudioPlayer stop]; 

    [soundFilePath release]; 

    [theAudioPlayer release]; 

    [super dealloc]; 
} 

现在释放对象之后..

- (void)dealloc { 

    [super dealloc]; 

    [theAudioPlayer stop]; 

    [soundFilePath release]; 

    [theAudioPlayer release]; 
} 

当我用第一种情况下,我浏览我的viewController首先1日至2日的viewController类再来巴克2日至1日,然后它瓦特生病给我一些控制台后面的错误。

#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) 

回答

10

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

因此,[super dealloc]应始终在方法的末尾。执行该行后,您无法做任何有意义的事情。

+0

谢谢。那为什么当我在1st viewController类中播放声音时,它将在浏览第2个viewController后继续运行。我想声音应该无限地播放,当我目前第一viewController类然后声音将停止和对象应该释放时,我导航第二viewController.Which我应该在那里使用。 – Tirth 2010-10-21 07:51:00

0

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

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

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

1

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

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

Memory Management Programming Guide

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

0

做到这一点的第一种方式。

不同的是,超类是高德的前拆掉了,你应该假设你的会员AR e现在也指向无效的记忆。 '之后'是危险的,尤其是当你的ivars在被销毁的物体的界面中使用任何东西时,尽管存在其他危险情况。

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

0

在释放资源时,您必须首先释放子资源,然后才能释放超级资源。

Thankyou prasad

相关问题