Память не освобождается в приложении iPhone - PullRequest
0 голосов
/ 19 ноября 2011

У меня проблема при использовании pushViewController - из 9 МБ объем памяти увеличивается до 28 МБ, но использование popViewController не освобождает память (предполагается, что она составляет 9 МБ), но я получаю 28 МБ.

Ниже приведен код, который выдвигает представление.

/* 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;
}

Ниже приведен файл PlayVideo.h

#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

и, наконец, ниже - файл PlayVideo.m

#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

Пытался найти проблему, но не смог ее найти.

Ответы [ 2 ]

1 голос
/ 19 ноября 2011

Ваша проблема здесь

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

вы устанавливаете mp = nil, не освобождая его, и когда вы освобождаете в dealloc, он отправляет сообщение nil, а не фактическому экземпляру mp.

отпустите mp и затем установите его на ноль.

0 голосов
/ 19 ноября 2011

Метод dealloc не вызывается, если какая-либо из ссылок, хранящихся в контроллере вида, все еще находится в памяти. так что вам нужно освободить свой объект mp перед тем, как открыть контроллер представления .. обратитесь к этому сообщению за дополнительной информацией .... iPhone - когда вызывается dealloc для контроллера представления?

...