由于过度释放,我看起来像是崩溃,但据我所知,我没有做错任何事情,但我可能对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的图像过早释放。
可能导致什么?
答案 0 :(得分:5)
将视图存储在类变量中是极其罕见的。你为什么这样做?
通常,在后台线程上访问UIView
是非法的。对于UIView
的构造是否在后台线程中是合法的,文档有点狡猾,但是一旦你深入initWithImage:
,它肯定没有明确支持,可能是不允许的。
如果您在后台线程上创建UIImage
有某种原因,那很好,但只需将UIImage
本身传递给主线程并在那里创建视图。您不需要类变量来在线程之间传递它。只需将其作为对象传递给performSelectorOnMainThread:withObject
。