假设视图(A)具有子视图。 视图(A)被取消分配,因为其保留计数为零。
视图(A)的子视图会发生什么? 它们是否被分离(从视图A中删除)并且它们的保留计数相应减少?
谢谢
答案 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被解除分配,而键值观察者仍然在其中注册。