首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSAutoreleasePool泄漏

NSAutoreleasePool泄漏
EN

Stack Overflow用户
提问于 2011-01-19 23:42:07
回答 2查看 527关注 0票数 0

我知道这一定是我忽略了的一些简单的东西,但是为什么它会泄露:

代码语言:javascript
复制
//add a pool for this since it is on its own thread
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//add the image
NSURL * imageURL = [NSURL URLWithString:[recipeData objectForKey:@"imagePath"]];
NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
UIImage * image = [UIImage imageWithData:imageData];
UIImageView * myImageView = [[UIImageView alloc] initWithImage:image];

//resize to make it fit the screen space 
CGRect frame = myImageView.frame;
frame.size.width = 320;
frame.size.height = 357;
myImageView.frame = frame;

[self.view addSubview:myImageView];


[activity stopAnimating];

[pool drain];
[self placeItems];

我得到了错误:

_NSAutoreleaseNoPool():NSPathStore2类的对象0x4e2fdf0在没有池的情况下自动释放-只是泄漏

我试着移动水池排水口的位置,但什么也没做。当我在谷歌上搜索一个原因时,我看到了很多看起来像这样的代码。

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-19 23:56:24

排出池具有释放并随后释放它的效果,因为自动释放池不能被保留。我怀疑在placeItems (或其他以[pool drain]命名的地方)中一定需要一个自动释放池,因为在这一点上,池可能已经消失了。

因此,您可能希望尝试注释掉排出消息,看看这是否会使泄漏消失。

票数 2
EN

Stack Overflow用户

发布于 2011-01-20 00:05:49

这里有很多要说的:

  • 首先,你泄露了myImageView。你必须在主线程之后释放它,因为你在另一个线程上,你的池排出必须在
  • 的末尾,因为你不在主线程上,你不能执行任何UI操作。尝试用[self.view performSelectorOnMainThread:@selector(addSubview:) withObject:myImageView waitUntilDone:YES]替换[self.view addSubview:myImageView]。与[activity stopAnimating].

相同

就像Brian说的,-drain消息必须在你的线程的末尾。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4737262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档