我想知道在发布[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)
答案 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)
在释放资源时,您必须首先释放子资源,然后取消分配超级资源。
三江源 普拉萨德