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

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

 2010-10-13 02:07:00 来源:本站整理   
核心提示:[mMyLeakyString release];你的直觉可能是这样不会发生泄露,但搜索代码中所有用到了mMyLeakyString的地方,iOS开发笔记Phone内存泄露:Leaks工具指引(3),在doSomethingNow中,它是这样用的:mMyLeakyString = [[NSString alloc] i

[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/内存管理/

上一页  1 2 3 

Tags:iOS 开发 笔记

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