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的图像过早释放.
可能导致什么?
将视图存储在类变量中是极其罕见的.你为什么做这个?
通常,UIView在后台线程上访问是非法的.对于UIView在背景线程上构建a 是否合法,文档有点狡猾,但是一旦你深入研究initWithImage:,它肯定没有明确支持,可能是不允许的.
如果你有一些原因要在UIImage后台线程上创建,那很好,但是只需将UIImage自己传递给主线程并在那里创建视图.您不需要类变量来在线程之间传递它.只需将其作为对象传递给performSelectorOnMainThread:withObject.