UIPopoverController Утечка памяти - PullRequest
0 голосов
/ 25 мая 2011

У меня есть универсальное приложение, чья часть iPad использует UIPopoverController, который отображает UIViewController, совместно используемый с частью iPhone.Когда версия iPhone загружается и освобождает контроллер представления, все в порядке (без утечки памяти).Когда iPad-версия загружает его, два элемента, NSDictionary и NSArray.

В контроллере представления два объекта создаются и удаляются, таким образом

- (void)setupModels {
    fonts = [[NSDictionary alloc] initWithObjectsAndKeys:
             @"Baskerville", @"Baskerville",
             @"Georgia", @"Georgia",
             @"HelveticaNeue", @"Helvetica Neue",
             @"Palatino-Roman", @"Palatino Roman",
             @"Verdana", @"Verdana", nil];

    fontNameKeys = [[NSArray alloc] initWithObjects:
                    @"Baskerville",
                    @"Georgia",
                    @"Helvetica Neue",
                    @"Palatino Roman",
                    @"Verdana", nil];
}

- (void)dealloc {
    [fonts release], fonts=nil;
    [fontNameKeys release], fontNameKeys=nil;

    [super dealloc];
}

Версия iPad создаетотклоняет UIPopoverController, таким образом

- (void)displaySettingsPopover:(id)sender {
    if([self.settingsPopover isPopoverVisible]) {
        //close the popover view if toolbar button was touched again and popover is already visible
        //Thanks to @chrisonhismac
        [self.settingsPopover dismissPopoverAnimated:YES];
        [self.settingsPopover.delegate popoverControllerDidDismissPopover:self.settingsPopover];
    } else {
        if (!self.settingsPopover) {
            //build our custom popover view
            PreferencesViewController_iPhone *pvc = [[PreferencesViewController_iPhone alloc] initWithNibName:nil
                                                                                                       bundle:nil
                                                                                               callbackObject:self
                                                                                                     selector:@selector(applySettingsFromPopover)];
            [pvc.view setBackgroundColor:[UIColor lightGrayColor]];
            [pvc.navigationItem setTitle:@"Preferences"];
            [pvc setContentSizeForViewInPopover:CGSizeMake(320, 444)];

            //create a popover controller
            self.settingsPopover = [[UIPopoverController alloc] initWithContentViewController:pvc];
            [pvc release];
            self.settingsPopover.delegate = self;
        }

        //present the popover view non-modal with a
        //refrence to the toolbar button which was pressed
        [self.settingsPopover presentPopoverFromBarButtonItem:sender
                                     permittedArrowDirections:UIPopoverArrowDirectionUp
                                                     animated:YES];
    }
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    [self.settingsPopover setDelegate:nil];
    [settingsPopover release];
    settingsPopover=nil;
}

Я не уверен, почему NSDictionary и NSArray просачиваются для iPad, но не для iPhone.Профилировщик говорит, что их счетчик запоминания изначально равен 1, но никогда не освобождается.

Спасибо!

1 Ответ

4 голосов
/ 25 мая 2011

Эта строка просачивается:

self.settingsPopover = [[UIPopoverController alloc] initWithContentViewController:pvc];

, если ваш settingsPopover является retain или copy свойством, retain очень вероятно. Дважды проверьте, что, если это действительно так, автоматически выпустите его так:

self.settingsPopover = [[[UIPopoverController alloc] initWithContentViewController:pvc] autorelease];
...