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.
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.