NSAutoreleasePool和类变量

时间:2011-10-02 22:16:37

标签: iphone objective-c ios memory memory-management

由于过度释放,我看起来像是崩溃,但据我所知,我没有做错任何事情,但我可能对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的图像过早释放。

可能导致什么?

1 个答案:

答案 0 :(得分:5)

将视图存储在类变量中是极其罕见的。你为什么这样做?

通常,在后台线程上访问UIView是非法的。对于UIView的构造是否在后台线程中是合法的,文档有点狡猾,但是一旦你深入initWithImage:,它肯定没有明确支持,可能是不允许的。

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