Search code examples
iphonememorypushviewcontrollerpopviewcontroller

Memory not released in iPhone app


I am having problem when I use pushViewController - Memory goes to 28 MB from 9 MB, but using popViewController does not releases the memory (supposed to become 9 MB) but I am getting 28 MB.

Below is the code that pushes the view.

/* Video Handler */
-(void)showVideo:(id)sender {
    UIButton *btn               = (UIButton *)sender;
    int nid                         =   btn.tag;

    masterdb *mdbT          = [[masterdb alloc] init];
    izc_news *nclsT         =   [mdbT getNewsDetail:nid];
    [mdbT release];
    NSString *vlink         =   nclsT.VideoLink;

    PlayVideo *vd               =   [[PlayVideo alloc] init];
    vd.hidesBottomBarWhenPushed =   YES;
    vd.videoLink                =   vlink;

    [self.navigationController pushViewController:vd animated:YES];
    [vd release];
    vd                                  =   nil;
}

Below is the PlayVideo.h file

#import <MediaPlayer/MediaPlayer.h>

@interface PlayVideo : UIViewController {
    NSString *videoLink;
    MPMoviePlayerController *mp;
    UIActivityIndicatorView *spinner;
}

@property(nonatomic, retain) NSString *videoLink;
@property(nonatomic, retain) MPMoviePlayerController *mp;
@property(nonatomic, retain) UIActivityIndicatorView *spinner;

@end

and finally below is the PlayVideo.m file

#import "PlayVideo.h"


@implementation PlayVideo

@synthesize videoLink; 
@synthesize mp;
@synthesize spinner;


- (void) viewDidLoad {

    [super viewDidLoad];

    videoLink       =   @"http://www.izooconnect.com/fwzNew/vids/testVid.mov";

    [[UIApplication sharedApplication] setStatusBarHidden:YES];

    [[self view] setBounds:CGRectMake(0, 0, 480, 320)];
    [[self view] setCenter:CGPointMake(160, 240)];
    [[self view] setTransform:CGAffineTransformMakeRotation(M_PI / 2)]; 


    CGRect mainBounds               = [[UIScreen mainScreen] bounds];
    CGRect indicatorBounds  = CGRectMake(mainBounds.size.height / 2 - 24, mainBounds.size.width / 2 - 24, 48, 48);
    spinner                                 =          [[UIActivityIndicatorView alloc] initWithFrame:indicatorBounds];
    spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
    spinner.tag                         =   1;
    [spinner startAnimating];
    [self.view addSubview:spinner];


    mp =  [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString: videoLink]];


    [[NSNotificationCenter defaultCenter] addObserver:self 
                                                                                 selector:@selector(moviePreloadDidFinish:) 
                                                                                         name:MPMoviePlayerContentPreloadDidFinishNotification 
                                                                                     object:nil];


    [[NSNotificationCenter defaultCenter] addObserver:self 
                                                                                 selector:@selector(moviePlayBackDidFinish:) 
                                                                                         name:MPMoviePlayerPlaybackDidFinishNotification 
                                                                                     object:nil];


[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];

    [[mp view] setFrame:CGRectMake(0, 0, 480, 320)];

    [mp setControlStyle:MPMovieControlStyleFullscreen];
    [mp setFullscreen:YES];

    [self.view addSubview:mp.view];

}


- (void) moviePreloadDidFinish: (NSNotification *) notification {
    UIActivityIndicatorView *tmpimg = (UIActivityIndicatorView *)[self.view viewWithTag:1];
    [tmpimg removeFromSuperview];
    [mp play];
}


- (void) moviePlayBackDidFinish: (NSNotification *) notification {
    [self.navigationController popViewControllerAnimated:YES];
}




- (void) dealloc {
    [mp release];
    [spinner release];
    [super dealloc];
}

@end

Tried to locate the problem but failed to find any.


Solution

  • Your problem is here

    - (void) moviePlayBackDidFinish: (NSNotification *) notification {
        mp  =   nil;
        [self.navigationController popViewControllerAnimated:YES];
    }
    

    you are setting mp = nil without releasing it and when you release in dealloc, it sends the message to nil and not to the actual instance of mp.

    release mp and then set it to nil.