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

iOS开发笔记 Phone内存泄露:Leaks工具指引

 2010-09-26 01:29:00 来源:WEB开发网   
核心提示:单击这个按钮,右边将会弹出一个窗口,iOS开发笔记 Phone内存泄露:Leaks工具指引(3),里边提供了各种关于内存泄露的详细信息,单击一个内存泄露,当然,在项目中可能有更好的方式来处理NSString,Extended Detail视图将会显示泄露的内存代码的完整调用堆栈,在我们上边的例子中

单击这个按钮,右边将会弹出一个窗口,里边提供了各种关于内存泄露的详细信息。单击一个内存泄露,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,但如果你这样处理的话可以修复这个泄露问题。

上一页  1 2 3 4  下一页

Tags:iOS 开发 笔记

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