2010-10-21 79 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

相關問題