WEB开发网
开发学院手机开发iPhone 开发 iPhone 内存泄露:Leaks 工具指引 阅读

iPhone 内存泄露:Leaks 工具指引

 2010-08-22 00:45:00 来源:WEB开发网   
核心提示:视图将会显示泄露的内存代码的完整调用堆栈,在我们上边的例子中,iPhone 内存泄露:Leaks 工具指引(3),单击第一个内存泄露提示,它发生在 [NSString initWithUTF8String],但如果你这样处理的话可以修复这个泄露问题,让我们看看第二个泄露问题,如果你选中调用堆栈里的高亮步骤,你会看到程序
视图将会显示泄露的内存代码的完整调用堆栈。在我们上边的例子中,单击第一个内存泄露提示,它发生在 [NSString initWithUTF8String]。如果你选中调用堆栈里的高亮步骤,你会看到程序最后一次调用是 [InstrumentsTestViewController viewDidLoad]。

双击 Extend Detail 视图中的某行,它会打开 XCode 窗口并显示出问题的代码,这是非常棒的功能。

在本例中,第一次 NSString 分配的时候出现了泄露,你需要做一些处理。这是个非常简单的例子,但找到为什么会发生泄露则要麻烦些。让我们仔细看一下例子。在 viewDidLoad 当中,我们为字符串分配到了内存,如下所示:

mMyLeakyString = [[NSString alloc] initWithUTF8String:”I’m a leaky string.”];

在 dealloc 当中我们用如下方式来释放

[mMyLeakyString release];

你的直觉可能是这样不会发生泄露,但搜索代码中所有用到了 mMyLeakyString 的地方,在 doSomethingNow 中,它是这样用的:

mMyLeakyString = [[NSString alloc] initWithUTF8String:

“Look, another alloc, but no release for first one!”];

注意,我们声明了一个新的字符串,并且将 mMyLeakyString 指向了它。这里的问题是我们没有在更改 mMyLeakyString 的指向前释放它原 来指向的内存。所以原始的字符串依然在堆中,并且我们没有办法释放这部分内存。dealloc 里的 release 操作实际释放的是我们在 doSomethingNow 中声明的字符串所占内存,因为这才是指针所指。

为了修复这个问题,我们可以把 doSomethingNow 改成下边的代码:

- (void) doSomethingNow

{

[mMyLeakyString release];

mMyLeakyString = [[NSString alloc] initWithUTF8String:

“Look, another alloc, but released first one!”];

}

这段代码做的是在我们指定 mMyLeakyString 到新的字符串前释放第一个字符串所占内存。重新编译运行程序,你会看到只有一个内存泄露。当然,在项目中可能有更好的方式来处理 NSString,但如果你这样处理的话可以修复这个泄露问题。

让我们看看第二个泄露问题。单击泄露提示看什么导致了内存泄露。发现这个泄露来自于 LeakyClass::LeakyClass() 构造函数:

上一页  1 2 3 4  下一页

Tags:iPhone 内存 泄露

编辑录入:coldstar [复制链接] [打 印]
赞助商链接