My code is working decently, but I can tell there is a memory leak from somewhere, but can't find the source of it. Any suggestions? .h Code: #import <UIKit/UIKit.h> #import <MediaPlayer/MediaPlayer.h> #import <AVFoundation/AVFoundation.h> @interface MovieView : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate, AVCaptureFileOutputRecordingDelegate>{ NSString *selectedCountry; MPMoviePlayerController *player; AVPlayer *avPlayer; AVPlayerLayer *avPlayerLayer; AVCaptureSession *session; } -(IBAction)endcall; @property (nonatomic, retain) NSString *selectedCountry; @property (nonatomic, retain) MPMoviePlayerController *player; @property(nonatomic, retain) IBOutlet UIView *vImagePreview; @property(nonatomic, retain) IBOutlet UIView *playit; @property (nonatomic, retain) AVCaptureSession *session; @end .m Code: #import "MovieView.h" #import <AudioToolbox/AudioToolbox.h> @implementation MovieView @synthesize selectedCountry, player, vImagePreview, playit, session; -(void) viewWillAppear:(BOOL)animated { self.navigationController.navigationBarHidden = YES; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; [[UIApplication sharedApplication] setStatusBarHidden:NO]; } - (void)viewDidLoad { NSError* error4 = nil; AVAudioSession* audioSession = [AVAudioSession sharedInstance]; if (![audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error4]) { NSLog(@"AVAudioSession setCategory failed: %@", [error4 localizedDescription]); } // Set audio session property "allow mixing" to true so audio can be recorded while it is playing UInt32 allowMixing = true; OSStatus status = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); if (status != kAudioSessionNoError) { NSLog(@"AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers) failed: %ld", status); } // Activate the audio session error4 = nil; if (![audioSession setActive:YES error:&error4]) { NSLog(@"AVAudioSession setActive:YES failed: %@", [error4 localizedDescription]); } session = [[AVCaptureSession alloc] init]; [session beginConfiguration]; session.sessionPreset = AVCaptureSessionPresetMedium; CALayer *viewLayer = self.vImagePreview.layer; NSLog(@"viewLayer = %@", viewLayer); AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; captureVideoPreviewLayer.frame = self.vImagePreview.bounds; [captureVideoPreviewLayer setCornerRadius:14]; [captureVideoPreviewLayer setBorderWidth:3.0]; [captureVideoPreviewLayer setBorderColor:[[UIColor whiteColor] CGColor]]; [[vImagePreview layer] setCornerRadius:14]; [[vImagePreview layer] setBorderWidth:3.0]; [[vImagePreview layer] setBorderColor:[[UIColor whiteColor] CGColor]]; [self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; AVCaptureDevice *device = [self frontFacingCameraIfAvailable]; NSError *error = nil; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; if (!input) { // Handle the error appropriately. NSLog(@"ERROR: trying to open camera: %@", error); } AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; NSError *error2 = nil; AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error2]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectoryPath = [paths objectAtIndex:0]; AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; NSString *archives = [documentsDirectoryPath stringByAppendingPathComponent:@"archives"]; NSString *outputpathofmovie = [[archives stringByAppendingPathComponent:@"Test"] stringByAppendingString:@".mp4"]; NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputpathofmovie]; [session addInput:input]; [session addInput:audioInput]; [session addOutput:movieFileOutput]; [session commitConfiguration]; [session startRunning]; [movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self]; //tests // Set audio session category to "play and record" //endtests //this is the end of recording the video and audio NSString *proud = [[documentsDirectoryPath stringByAppendingPathComponent:@"proud"] stringByAppendingPathComponent:selectedCountry]; NSURL *movieURL = [[NSURL fileURLWithPath:proud] retain]; self.player = [[MPMoviePlayerController alloc] initWithContentURL: movieURL]; player.useApplicationAudioSession=YES; [player prepareToPlay]; player.controlStyle = MPMovieControlStyleNone; player.allowsAirPlay = NO; player.scalingMode = MPMovieScalingModeFill; self.player.view.frame = self.view.frame; [self.view insertSubview:player.view belowSubview:vImagePreview]; [self.player setFullscreen:YES animated:YES]; // ... [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:player]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:player]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillExitFullscreen:) name:MPMoviePlayerWillExitFullscreenNotification object:player]; [player play]; [super viewDidLoad]; } - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { //finished NSLog(@"Finished"); } -(IBAction)endcall { [player stop]; [session stopRunning]; } -(AVCaptureDevice *)frontFacingCameraIfAvailable { NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; AVCaptureDevice *captureDevice = nil; for (AVCaptureDevice *device in videoDevices) { if (device.position == AVCaptureDevicePositionFront) { captureDevice = device; break; } } // couldn't find one on the front, so just get the default video device. if ( ! captureDevice) { captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; } return captureDevice; } - (void) movieFinishedCallback:(NSNotification*) aNotification { NSLog(@"MovieDone"); [player.view removeFromSuperview]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player]; [session stopRunning]; [self.navigationController popToRootViewControllerAnimated:NO]; } - (void) exitedFullscreen:(NSNotification*) aNotification { NSLog(@"MovieDone"); [player.view removeFromSuperview]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:player]; } - (void)moviePlayerWillExitFullscreen:(NSNotification*) aNotification { [player stop]; [self dismissMoviePlayerViewControllerAnimated]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerWillExitFullscreenNotification object:player]; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } - (void) dealloc { [selectedCountry release]; [playit release]; [vImagePreview release]; [player release]; [session release]; session = nil; [super dealloc]; } @end
What have you tried? Static analyzer? What? Simply scrolling through your code, I see inconsistent use of properties vs. instance variables. Examples: Code: session = [[AVCaptureSession alloc] init]; ... self.player = [[MPMoviePlayerController alloc] initWithContentURL: movieURL]; player.useApplicationAudioSession=YES; Since your properties are all declared with retain attribute, the self.player assignment is wrong. If you run the static analyzer, does it point at this? If you don't have a reason to use properties, don't. If you don't know why or when properties should be used, then you haven't thought through the encapsulation aspects of the design.