iOS开发笔记 Phone内存泄露:Leaks工具指引
2010-09-26 01:29:00 来源:WEB开发网单击这个按钮,右边将会弹出一个窗口,里边提供了各种关于内存泄露的详细信息。单击一个内存泄露,Extended Detail视图将会显示泄露的内存代码的完整调用堆栈。在我们上边的例子中,单击第一个内存泄露提示,它发生在[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,但如果你这样处理的话可以修复这个泄露问题。
更多精彩
赞助商链接