gpt4 book ai didi

iphone - 追踪 cocoa 内存泄漏

转载 作者:行者123 更新时间:2023-12-03 20:59:52 29 4
gpt4 key购买 nike

我收到了有关我的应用程序中内存泄漏的报告,但我无法准确追踪到底发生了什么。我有一个功能可以取出旧 View 并交换新 View 。我没有使用 NavControllers 或任何 @properties;我直接管理我的顶级窗口。

-(void)swapInView:(UIViewController*)newViewController
{
[currentViewer.view removeFromSuperview];
printf("Old viewController (%p) has count of %d; now releasing\n",
currentViewer, [currentViewer retainCount]);
[currentViewer release];
currentViewer = 0;

currentViewer = newViewController;
[currentViewer retain];

[mainWindow addSubview:currentViewer.view];
[mainWindow bringSubviewToFront:currentViewer.view];
}

运行代码时,我显示当前 View Controller 正在被释放,然后该 View Controller 的 dealloc 方法被调用。但是,Instruments/leaks 仍然将其报告为泄漏。例如,我得到以下打印结果:

Old viewController (0x119f80) has count of 1; now releasing
Deallocating WelcomeScreenViewController

我可以从该地址验证,这与之前分配的对象是同一对象。

我的外部代码如下所示:

MyViewController *theViewController = [[MyViewController alloc]
initWithNibName:nil
bundle:nil];
[GameMaster swapInNewView:theViewController];
[theViewController release];

有人对如何追踪正在发生的事情有任何建议吗?我使用的是 3.1.2 SDK,但我也在早期的 SDK 上看到过这种情况。

最佳答案

嗯。这很有趣。我写了一个快速测试来确保我们都没有疯。

最后,一切都归结为调用代码:

[[MyViewController alloc] initWithNibName:nil bundle:nil];

当您初始化 View Controller 时,其view对象尚未定义,并且在请求之前不会定义。

由于您为 Nib 名称指定了 nil,因此您必须重写 UIViewController 子类中的 loadView 才能正确设置 View 对象。请参阅Apple's documentation了解详情。

loadView 的默认实现显然做了一些幕后魔法,而这些魔法可能会导致内存泄漏。

所以:当您调用此电话时:

[mainWindow addSubview:currentViewer.view];

您实际上正在调用两次电话:

一:currentViewer.view,这会导致调用[currentViewer loadView],以及
二:[mainWindow addSubview:...],尝试添加新加载的 View 。

Leaks 会因为第一次调用而不是第二次调用而识别出此行。

要进行验证,只需修改自定义 UIViewController 子类中的 loadView 方法即可:

- (void)loadView
{
[self setView:[[UIView new] autorelease]];
}

这可以防止调用默认的loadView,现在不再有泄漏。

显然,一旦您进一步开发此应用程序,您要么必须在 loadView 中放置更有意义的内容,要么使用 nib。

关于iphone - 追踪 cocoa 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1753790/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com