这是我经常看到的一种常见做法(包括来自非常受欢迎的iPhone开发者书籍)
在.h文件中:
@interface SomeViewController : UIViewController { UIImageView *imgView; }
在.m文件中的某个地方:
imgView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; [imgView setImage:[UIImage imageNamed:@"someimage.png"]]; [self addSubview:imgView]; [imgView release];
后来,我们看到了......
- (void) dealloc { [imgView release]; [super dealloc]; }
由于imgView具有匹配的alloc和release,是否需要在dealloc中发布imgView?
addSubview调用保留的imgView在哪里占了?
代码不正确.在你imgView
被解除分配后,你最终会被释放.
在.m文件中,您:
alloc
它 - >你拥有它
将其添加为子视图 - >您和UIView拥有它
release
它 - >你不拥有它
然后dealloc
,release
即使你在我们在上面的步骤3中建立了你不拥有它,你也可以使用imgView.当你打电话时[super dealloc]
,视图将释放它的所有子视图,我想你会得到一个例外.
如果你想保留一个ivar imgView
,我建议你在将它添加为子视图后不要打电话release
,并保持dealloc
相同.这样,即使imgView
在某个时候从视图层次结构中删除,您仍然会有一个有效的引用.