首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSAutoreleasePool和类变量

NSAutoreleasePool和类变量
EN

Stack Overflow用户
提问于 2011-10-03 06:16:37
回答 1查看 162关注 0票数 0

由于过度发布,我得到了看起来像是崩溃的东西,但据我所知,我没有做错任何事情,但是我可能对AutoreleasePools和类变量有错误的想法。

如果我有一个类变量:

代码语言:javascript
复制
UIImageView *imageView;

我将它分配到一个线程中,如下所示:

代码语言:javascript
复制
 - (void)setupThreaded {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

     UIImage *image = [UIImage imageNamed:@"myimage.png"];
     imageView = [[UIImageView alloc] initWithImage:image];

     [self performSelectorOnMainThread:@selector(addViewOnMainThread) withObject:nil waitUntilDone:YES];

     [pool release];
}

- (void)addViewOnMainThread {
    [self.view addSubView:imageView];
}

我目前偶尔会收到一个错误,表明要么是imageView过早发布了,要么是imageView的图像过早发布了。

是什么导致了这种情况呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-03 06:26:25

将视图存储在类变量中是非常不寻常的。你为什么要这么做?

一般来说,在后台线程上访问UIView是非法的。关于在后台线程上构造UIView是否合法,文档有点不太靠谱,但是一旦你深入到initWithImage:中,它肯定不被显式地支持,并且可能是不允许的。

如果出于某种原因,您要在后台线程上创建UIImage,这很好,但是只需将UIImage本身传递给主线程并在那里创建视图即可。您不需要类变量来在线程之间传递它。只需将其作为对象传递给performSelectorOnMainThread:withObject

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

https://stackoverflow.com/questions/7629601

复制
相关文章

相似问题

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