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

标签 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。

最佳答案

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

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

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

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

这就是为什么 loadPopover 对象只有在您向它发送两个释放消息时才会被释放,但是您永远不应该诉诸这些技巧

编辑:

您还有另一个内存管理问题。你正在释放一个你不拥有的对象:

[popoverController.contentViewController release];

保留/释放 contentViewControllerpopoverController 的职责。通过这样做,您将过度释放 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;
}

关于ios - UIPopoverController 和内容 ViewController - 内存管理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6538439/

相关文章:

iphone - 数据未保存到核心数据

ios - 如何删除 UIStackView 中两个 tableview 之间的空间?

ios - 无法构建项目 - libswiftAVFoundation.dylib : errSecInternalComponent error: Task failed with exit 1 signal 0

ios - 当目标为 7.0 时,Xcode 引发 "EXC_BAD_ACCESS code=1"

c++ - 高效存储最多 2048 个字符的数组?

java - 释放 Android 5 上使用的 ImageView 的内存

c++ - malloc 分配的内存可以使用多少时间?

ios - iPhone 断开连接时如何在 iWatch 上显示本地通知?

ios - 绘图应用程序 ios 中的撤消和重做功能

iphone - 解析具有相同标签的 XML 文件