UIPopoverController和内容ViewController - 内存管理问题

时间:2011-06-30 17:06:33

标签: ios xcode memory-management uipopovercontroller

请检查我关于UIPopoverController和loadViewController的发布的方法


- (IBAction) manageCardSets:(UIBarButtonItem*)baritem {
    LoadViewController *loadViewController = [[LoadViewController alloc] initWithStyle:UITableViewStylePlain]; 

    self.loadPopover = [[UIPopoverController alloc] initWithContentViewController:loadViewController];
    self.loadPopover.delegate = self;

    [self.loadPopover presentPopoverFromBarButtonItem:baritem permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];   

    [loadViewController release];
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {

    [popoverController.contentViewController release];
    self.loadPopover = nil;
    [_loadPopover release]; 
}

正如您所看到的,我发布了两次loadViewController并且代码正常工作,没有泄漏,但我有些疑惑。 如果我发布一次,则不会在loadViewController中调用dealloc。

1 个答案:

答案 0 :(得分:1)

如果您的loadPopover属性是保留/复制,则以下行过度保留对象并泄漏:

self.loadPopover = [[UIPopoverController alloc] initWithContentViewController:loadViewController];

alloc-init和属性访问器都保留了对象。这应该是:

self.loadPopover = [[[UIPopoverController alloc] initWithContentViewController:loadViewController] autorelease];

这就是loadPopover对象只有在你发送两条发布消息时才被解除分配的原因,但是你永远不应该使用这些技巧

修改

您还有另一个内存管理问题。您将在此行中释放您不拥有的对象:

[popoverController.contentViewController release];

保留/释放popoverControllercontentViewController责任。通过这样做,您过度释放 contentViewController

总而言之,您的代码将如下所示:

- (IBAction) manageCardSets:(UIBarButtonItem*)baritem {
    LoadViewController *loadViewController = [[LoadViewController alloc] initWithStyle:UITableViewStylePlain]; 

    self.loadPopover = [[[UIPopoverController alloc] initWithContentViewController:loadViewController] autorelease];
    self.loadPopover.delegate = self;

    [self.loadPopover presentPopoverFromBarButtonItem:baritem permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];   

    [loadViewController release];
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    self.loadPopover = nil;
}