iOS开发笔记Phone内存泄露:Leaks工具指引
2010-10-13 02:07:00 来源:本站整理[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()构造函数:
在调用堆栈中双击它,出问题的代码将会再次出现在XCode中。
我们看到在构造函数里声明了一个新的LeakedObject对象,但是析构函数没有删除,这样不好。对于每一个new操作,都需要有与之对应的delete操作。所以我们把析构函数改变成下边的样子:
LeakyClass::~LeakyClass()
{
if (mLeakedObject != NULL)
{
delete mLeakedObject;
mLeakedObject = NULL;
}
}
重新编译运行,没有内存泄露了!
我选择这两个例子,虽然非常简单,但他们展示了Instruments可以用来追踪Object-C和C++中的内存泄露。
修复你的内存泄露问题吧,记住,没有内存泄露的程序才是一个好程序。
http://www.cnblogs.com/MobileDevelop/tag/内存管理/
更多精彩
赞助商链接