Checking for Memory Leak

Discussion in 'iOS Programming' started by newtoiphonesdk, Apr 28, 2012.

  1. newtoiphonesdk macrumors 6502a

    Joined:
    Jul 30, 2010
    #1
    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
    
     
  2. chown33 macrumors 604

    Joined:
    Aug 9, 2009
    #2
    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.
     

Share This Page