[英](iphone) what happens to subviews when superview is dealloced?
假设一个视图(A)具有子视图。 由于其保留计数为零,因此视图(A)正在被释放。
视图(A)的子视图会怎样?
它们是否分离(从视图A中移出)并且保留数相应减少?
谢谢
假设“视图”实际上是指“ 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];
}
}
超级视图的取消分配将调用子视图的removeFromSuperview ,然后调用子视图的willMoveToSuperview以“告知其超级视图将要更改为指定超级视图的视图。”在这种情况下,将被取消分配。
在子视图的willMoveToSuperview中设置调试点可以轻松验证这一点。
因此,如果子视图是kvo superview的属性,那么在这里是removeObserver的好地方,因为如果我们这样做,子视图dealloc(稍后将被调用)已经为时已晚。 我们将得到类似“ NSInternalInconsistencyException”之类的异常,原因是:“ UITableView类的实例0x135a9a600被释放,而键值观察器仍在其中注册。
所有子视图将被释放。
如果主视图被释放或释放,则其内部的所有子视图也将被释放
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.