由于过度发布,我得到了看起来像是崩溃的东西,但据我所知,我没有做错任何事情,但是我可能对AutoreleasePools和类变量有错误的想法。
如果我有一个类变量:
UIImageView *imageView;我将它分配到一个线程中,如下所示:
- (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的图像过早发布了。
是什么导致了这种情况呢?
发布于 2011-10-03 06:26:25
将视图存储在类变量中是非常不寻常的。你为什么要这么做?
一般来说,在后台线程上访问UIView是非法的。关于在后台线程上构造UIView是否合法,文档有点不太靠谱,但是一旦你深入到initWithImage:中,它肯定不被显式地支持,并且可能是不允许的。
如果出于某种原因,您要在后台线程上创建UIImage,这很好,但是只需将UIImage本身传递给主线程并在那里创建视图即可。您不需要类变量来在线程之间传递它。只需将其作为对象传递给performSelectorOnMainThread:withObject。
https://stackoverflow.com/questions/7629601
复制相似问题