开发者

how to fix iOS leak when flipping between two views

开发者 https://www.devze.com 2023-03-18 02:03 出处:网络
My iPhone app badly leaks when flipping back and forth between a main uiviewcontroller and a help uiviewcontroller .

My iPhone app badly leaks when flipping back and forth between a main uiviewcontroller and a help uiviewcontroller .

Here is the source of the main view, followed by source of the help view.

MAIN VIEW - FLIP TO HELP.....................

// 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 = [[Help开发者_StackOverflowView alloc] initWithNibName:@"HelpView" bundle:nil];
    controller.delegate = self;

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

    [controller release];
}

HELP VIEW - INIT.............................

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

    help_scroll.editable = FALSE;

  return;
}

HELP - RETURN TO MAIN VIEW.........................

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

MAIN VIEW - RETURN FROM HELP...............................

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


You are creating a controller with ref count of 1 and a local reference each time showHelp: is called:

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

you are losing your reference to it at the end of this method.

You happen to have references to it in done: (self) and *_help_didFinish (controller), but you never release it in either of those locations. Dismissing the controller is fine, but you also have to release it.

(Another option would be to never create a second one, and maintain an iVar to the original.)


You could well be leaking on this line

controller.delegate = self;

What is your property declaration for the delegate. If it's anything other than assign, then you either need to change it (preferred option) or make sure you are releasing it in the dealloc method of HelpView controller.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号