(iphone)当superview被解除分配时,子视图会发生什么?

时间:2011-04-24 10:44:29

标签: iphone view subview retain

假设视图(A)具有子视图。 视图(A)被取消分配,因为其保留计数为零。

视图(A)的子视图会发生什么? 它们是否被分离(从视图A中删除)并且它们的保留计数相应减少?

谢谢

4 个答案:

答案 0 :(得分:1)

假设通过'view'你实际上是指'UIView的实例':

视图会保留其子视图,因此,如果视图被取消分配,则子视图会被释放,其保留计数会减少一个。

我不确定,但我视图层次结构是这样实现的:

@interface UIView : UIResponder {
  NSArray *_subviews;
}

@property(nonatomic, retain) NSArray *subviews;

@end

@implementation UIView
@synthesize subviews;
- (void)dealloc {
  [subviews release];
  [super dealloc];
}
@end

你可以粗略地说NSObject声明一个无符号整数,它是保留计数,如下所示:

unsigned retainCount;

然后,这些将是-[id<NSObject> retain]-[id<NSObject> release]

的实现
- (void)retain {
  retainCount++;
}

- (void)release {
  retainCount--;
  if (retainCount == 0) {
    [self dealloc];
  }
}

答案 1 :(得分:0)

所有子视图都将被发布。

答案 2 :(得分:0)

如果主视图被释放或取消分配,那么其中的所有子视图也将被释放

答案 3 :(得分:0)

superview的dealloc将调用子视图&#39; removedFromSuperview ,然后进入子视图&#39; willMoveToSuperview to&#34;告诉视图其超级视图即将更改为指定的超级视图。&#34;,在这种情况下即将被解除分配。

在子视图中设置调试点 willMoveToSuperview 可以轻松验证这一点。

因此,如果是子视图kvo superview的属性,这里是removeObserver的好地方,因为如果我们这样做suballoc,后面会调用dealloc,已经太晚了。我们将会出现异常,例如,NSInternalInconsistencyException&#39;,原因:&#39; UITableView类的实例0x135a9a600被解除分配,而键值观察者仍然在其中注册。