как исправить утечку iOS при переключении между двумя представлениями - PullRequest
1 голос
/ 08 июля 2011

Приложение для моего iPhone сильно просачивается при переключении между основным uiviewcontroller и help uiviewcontroller.

Здесь находится источник основного представления, а затем источник представления справки.* ОСНОВНОЙ ВИД - ПЕРЕКЛЮЧЕНИЕ В ПОМОЩЬ .....................

// Changes from operational view to Help view.
- (IBAction)showHelp:(id)sender 
{    
    // End trial mode:
    self.stop_trial_if_started; 
    self.rename_trial_if_edited;

    // Switch to trial help:
    help_view_context = 0;

    HelpView *controller = [[HelpView alloc] initWithNibName:@"HelpView" bundle:nil];
    controller.delegate = self;

    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:controller animated:YES];

    [controller release];
}

ПОМОЩЬ - ВНУТРИ .............................

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor];   

    help_scroll.editable = FALSE;

  return;
}

ПОМОЩЬ - ВОЗВРАТ В ГЛАВНЫЙ ВИД .........................

// User clicked the button to return to operational view:
- (IBAction)done:(id)sender {
    NSLog(@"help-  done");
    if( help_view_context == 0 ) {
        [self.delegate trial_help_DidFinish:self];  
    }else{
          [self.delegate file_help_DidFinish:self]; 
    }
}

ОСНОВНОЙ ВИД - ВОЗВРАТ ИЗ ПОМОЩИ ...............................

// Inits operational view when user changes from Help view back to operational view.
- (void)trial_help_DidFinish:(HelpView *)controller {
    NSLog(@"trial_help_DidFinish");
    [self dismissModalViewControllerAnimated:YES];
    self.init_trial_operation;
}

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Вы создаете контроллер с числом ссылок 1 и локальной ссылкой каждый раз, когда вызывается showHelp::

HelpView *controller = [[HelpView alloc] initWithNibName:@"HelpView" bundle:nil];

вы теряете ссылку на него в конце этого метода.

У вас есть ссылки на него в done: (self) и *_help_didFinish (controller), но вы никогда не выпускаете его ни в одном из этих мест.Уволить контроллер - это нормально, но вы также должны release его.

(Другой вариант - никогда не создавать второй и поддерживать iVar в оригинале.)

0 голосов
/ 08 июля 2011

Вы могли бы просочиться в эту линию

controller.delegate = self;

Какова ваша декларация собственности для делегата. Если это что-то отличное от присвоения, вам нужно либо изменить его ( предпочтительный вариант ), либо убедиться, что вы освобождаете его в методе dealloc контроллера HelpView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...