请解释一下这个泄漏

Posted

技术标签:

【中文标题】请解释一下这个泄漏【英文标题】:Please explain me about this leak 【发布时间】:2011-10-13 04:01:29 【问题描述】:

我的日志中有以下错误消息:

2011-10-13 10:41:44.504 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4e0ef40 of class CABasicAnimation autoreleased with no pool in place - just leaking
2011-10-13 10:41:44.505 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4b03700 of class NSConcreteValue autoreleased with no pool in place - just leaking
2011-10-13 10:41:44.506 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4b04840 of class __NSCFDictionary autoreleased with no pool in place - just leaking

当我运行以下代码时出现错误消息。

CGRect newFrame = [viewTop frame];
newFrame.origin.x = 0;
newFrame.origin.y = 0;
[UIView beginAnimations:@"nil1" context:nil];
[UIView setAnimationDuration:0.3f];
[viewTop setFrame:newFrame];
[UIView commitAnimations];

有什么见解吗?谢谢你的好意

【问题讨论】:

【参考方案1】:

发生这种情况是因为您在不存在自动释放池的情况下使用了自动释放的对象。你可以阅读更多关于NSAutoreleasePool here的信息。

在您的可可开发过程中,您可能已经看到过这样的表达方式:

@"string text"
[NSMutableArray arrayWithCapacity: 42]
[someObject autorelease]

所有这些都使用了自动释放池。在前两种情况下,会为您向对象发送autorelease 消息。在最后一种情况下,我们将其显式发送给对象。 autorelease 消息说“当最近的自动释放池耗尽时减少引用计数。”这是一个例子:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSObject *myObject = [[NSObject alloc] init]; // some object
[myObject autorelease]; // send autorelease message
[pool release]; // myArray is released here!

正如您可能想象的那样,如果您autorelease 一个对象希望池稍后释放它,则可能会发生内存泄漏。 Cocoa 检测到这一点并抛出您在上面发布的错误。

通常在 Cocoa 编程中,NSAutoreleasePool 始终可用。 NSApplication 的运行循环在每次迭代时都会耗尽它。但是,如果您在主线程之外工作(即,如果您创建了自己的线程)或者如果您在调用NSApplicationMain[NSApp run] 之前工作,则不会有一个自动释放池。您通常可以通过添加一个来解决此问题:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
CGRect newFrame = [viewTop frame];
newFrame.origin.x = 0;
newFrame.origin.y = 0;
[UIView beginAnimations:@"nil1" context:nil];
[UIView setAnimationDuration:0.3f];
[viewTop setFrame:newFrame];
[UIView commitAnimations];
[pool release];

【讨论】:

以上是关于请解释一下这个泄漏的主要内容,如果未能解决你的问题,请参考以下文章

可以在这个例子中解释代码流吗??内存泄漏?在哪里?

sonarQube 中的“泄漏期”是啥意思?

Java中的内存泄漏

为啥使用“新”会导致内存泄漏?

带有 UI 和内存泄漏的保留片段

cppcheck 检测到资源泄漏 - 误报?