【问题标题】:Memory management of UITableViewController, UITableView & UIPopoverControllerUITableViewController、UITableView & UIPopoverController 的内存管理
【发布时间】:2011-10-16 07:43:54
【问题描述】:

我试图找出在以下实现中执行内存管理的最佳方法:

我有一个 UIPopoverController,它将在视图的 viewDidLoad 时创建,并且仅在 viewDidUnload 时消失。

在 UIPopoverController 内部,我正在显示一个 UITableView。

这是我当前在 .h 中的实现:

UIPopoverController *aPopoverController;
@property (nonatomic, retain) UIPopoverController *aPopoverController;

在.m:

@synthesize *aPopoverController;

在viewDidLoad时调用的.m方法中:

UITableViewController *aTableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];

UITableView *aTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 100, 800)];
aTableViewController.tableView = aTableView;

aTableView.delegate = self;
aTableView.dataSource = self;

aPopoverController = [[UIPopoverController alloc] initWithContentViewController:aTableViewController];

viewDidUnload时应该如何释放这些对象?

【问题讨论】:

    标签: iphone ios memory-management uipopovercontroller


    【解决方案1】:

    请在此代码之后立即发布 aTableViewaTableViewController

    更具体地说,UITableViewController 保留了表格视图,因此您无需再保留它,而UIPopoverController 保留了内容视图控制器,因此您可以将 aTableViewController 传递给弹出框控制器。

    -viewDidUnload 中,您的弹出框控制器被释放,它释放表视图控制器,然后释放表视图。就这么简单。

    我会这样说:

    UITableViewController *aTableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
    
    UITableView *aTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 100, 800)];
    aTableView.delegate = self;
    aTableView.dataSource = self;
    aTableViewController.tableView = aTableView;
    [aTableView release];
    
    aPopoverController = [[UIPopoverController alloc] initWithContentViewController:aTableViewController];
    [aTableViewController release];
    

    【讨论】:

    • 嗨@ayoy,谢谢!我发布了aTableViewaTableViewController。我检查了 3 个对象的保留计数,aTableViewControlleraPopoverController 都返回 1。知道为什么 aTableView 的保留计数仍然为 2。我认为它应该是 1,因为 aTableView 只是由aTableViewController 保留。如果没有,当我尝试在 viewDidUnload 释放 aTableView 时,它的计数仍然是 1。
    • 我意识到aTableViewController.tableView = aTableView 也增加了atableView 的保留计数。是否必须在 viewdidUnload 处发送aTableViewController.tableView = nil
    • 是的,它增加了aTableView 保留计数,以便以后可以使用它。它应该是你唯一的保留源,这就是为什么你可以(并且应该)在那个电话之后立即释放aTableView 而忘记它。我想知道第二个保留来自哪里......
    • 我一直以为UITableView *aTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 100, 800)];会将保留计数设置为1。那么aTableViewController.tableView = aTableView会将保留计数增加到2?
    • 我正在使用retainCount,我刚刚发现它应该是not be used,因为它可能不准确。这就解释了为什么在执行[aTableView release] 之前和之后保留计数相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多