【问题标题】:Bad memory leak when creating a view - even though a 'release' is present?创建视图时出现严重的内存泄漏 - 即使存在“释放”?
【发布时间】:2011-06-08 06:25:39
【问题描述】:

我的部分代码以如下方式呈现了一个 UITableViewController:

FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"Settings" bundle:nil];
flipside = [[UINavigationController alloc] initWithRootViewController:controller];  
controller.delegate = self;
flipside.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:flipside animated:YES];
[flipside release];
[controller release];

使用泄漏工具,不会发现内存泄漏。但是,每当我打开设置菜单(如上面的代码所示)时,似乎分配了更多内存并且从未释放 - 每次几乎 100 kB。

奇怪的是,最后包含两个释放语句似乎对内存分配没有影响..?我对 Objective-c 中的内存分配有什么误解,或者发生了什么奇怪的事情?

任何想法都非常感谢 - 谢谢!

【问题讨论】:

  • 你是如何测量内存增加的?另外,您是在模拟器上还是在设备上测量这种增长?
  • 使用模拟器 - 使用“分配”工具运行。每次我打开设置菜单时,“所有分配”项都会显着上升。
  • 您是否在 NSZombieEnabled 设置为 YES 的情况下运行?
  • 前段时间我使用 NSZombieEnabled 对其进行测试,但后来删除了该选项。我刚刚也尝试在实际设备上运行它 - 结果相同。
  • 查看一些alloc数据,看起来控制器的Nib文件中存在的所有对象仍然加载到内存中?

标签: iphone objective-c memory-management memory-leaks uiviewcontroller


【解决方案1】:

如果 Flipside 是保留属性,则导航控制器正在泄漏。问题是您绕过访问器方法并直接释放反面。这只是混乱的代码。一个更好的方法是为flipside创建一个访问器方法,如果你还没有创建一个,它只会分配一个新的。这称为延迟加载。为此,只需将 @synthesize 保留为反面(但您不应从访问器方法外部设置它),在您的头文件中将属性更改为,并将此方法添加到实现中:

- (UINavigationController *)flipside {
    if (flipside != nil) {
        return flipside;
    }
    FlipsideViewController *controller = [[[[FlipsideViewController alloc] initWithNibName:@"Settings" bundle:nil];
    controller.delegate = self;
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
    [controller release];
    navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    // This implies a retain if your flipside property is set to retain
    self.flipside = navController;
    [navController release];
}

确保将 self.flipside = nil 放入视图控制器的 viewDidUnload 方法中,您包含的代码来自(我假设这是一个 presentSettings 操作)。 您的 presentSetting 操作现在应该是这样的:

- (IBAction)presentSettings {
    // make sure you use the accessor self.flipside instead on accessing the variable directly
    [self presentModalViewController:self.flipside animated:YES];
}

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 2012-06-08
    • 2020-09-19
    • 2012-03-22
    • 1970-01-01
    • 2012-02-28
    • 2011-01-27
    • 2014-09-19
    相关资源
    最近更新 更多