NSAutoreleasePool和类变量

Shi*_*zam 0 memory iphone memory-management objective-c ios

由于过度释放,我看起来像是崩溃,但据我所知,我没有做错任何事情,但是我可能对AutoreleasePools和类变量有错误的想法.

如果我有一个类变量:

UIImageView *imageView;
Run Code Online (Sandbox Code Playgroud)

我在一个这样的线程中分配它:

 - (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];
}
Run Code Online (Sandbox Code Playgroud)

我目前偶尔会收到一个错误,提示imageView过早释放或者imageView的图像过早释放.

可能导致什么?

Rob*_*ier 5

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

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

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