Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between releasing object before and after [super delloc] statement?

I want to know what is the difference between before releasing my object of [super delloc] and after releasing my object of line [super delloc]

For example, Before..

- (void)dealloc {
    [theAudioPlayer stop];

    [soundFilePath release];

    [theAudioPlayer release];

    [super dealloc];
}

Now after releasing object..

- (void)dealloc {

    [super dealloc];

    [theAudioPlayer stop];

    [soundFilePath release];

    [theAudioPlayer release];
}

When i used 1st case and i navigating my viewController firstly 1st to 2nd viewController class and again come backe 2nd to 1st then it will give me some error something following console.

#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) 
like image 904
Tirth Avatar asked Dec 22 '22 22:12

Tirth


2 Answers

The second way is categorically wrong. NSObject's dealloc literally deallocates the object, and [super dealloc] inevitably reaches NSObject's implementation for any properly written Cocoa class. This means that the memory for the object executing the dealloc method is no longer allocated, and accessing the memory that used to be the object's instance variables — even just to send them release — is undefined behavior.

Because of this, [super dealloc] should always come at the end of the method. You can't do anything meaningful after that line executes.

like image 87
Chuck Avatar answered Jan 12 '23 00:01

Chuck


You have to release the object of your class before release the one of the superclass. It is the inverse operation of a new.

When you call the [supper dealloc] you could consider that the object is no more an object of your class, but of the super class. (I don"'t know if I really clear...)

From Memory Management Programming Guide:

If your class has object instance variables that it owns, you must implement a dealloc method that releases them, and then invokes super’s implementation.

like image 45
Benoît Avatar answered Jan 12 '23 01:01

Benoît