我看到了一个关于引用计数的问题:
取三个对象:祖父母,父母和孩子。祖父母保留父母,父母保留孩子,孩子保留父母。祖父母释放父母。解释会发生什么
“祖父母保留父母?”
这是什么意思?像这样:
Class *grandparent = [[Grandparent alloc]init];
Class *parent = [grandparent copy];
..............
有人帮助我......
答案 0 :(得分:2)
即使祖父母释放父母。它仍导致父母和孩子之间的保留周期。
除非对父母或孩子有其他一些提及,否则他们都会变得悬而未决。但是父母和孩子之间的保留周期阻止了被释放,并且它们变成了浪费的记忆。
孩子不应该留住父母。如果有的话,在子代中使用弱引用来维护对父代的引用。
答案 1 :(得分:1)
在讨论对象时,“父子关系”意味着对象的层次结构,这些对象可以表示为父亲拥有对其子女的强引用的树。如果您可以绘制对象树,则“父”将更接近根,而“子”将更接近叶节点。一般来说,父母是先创造的,并且比他们的孩子活得更长。
例如:
@interface Parent : NSObject
@property(nonatomic, strong) NSObject *child;
@end
@implementation Parent
- (id)init {
self = [super init];
if (self) {
self.child = [[NSObject alloc] init];
}
return self;
}
@end
一个常见的例子是UIViewController
,它是UIView
孩子的“父母”。该视图也可能是“子”子视图的“父”,使控制器成为子视图的“祖父母”。
这些关系确实描述了通常出现在应用程序中的所有权模式,而不是绝对规则。并非真实应用程序中的每个对象都属于结构良好的树,但它是大多数应用程序中出现的常见模式。您可能还会看到两个具有共同“父”的对象,称为“兄弟”对象。
答案 2 :(得分:0)
这里“祖父母”保留“父母”,“父母”保留“孩子”,而“孩子”保留“父母”。这里在父母和孩子之间建立保留周期。释放祖父母后,父母和子女都成为孤儿,但父母的保留计数不会为零,因为孩子会保留父母,因此会导致记忆管理问题。
保留周期是条件当2个对象保持对彼此的引用并被保留时,它会创建一个保留周期,因为两个对象都试图相互保留,从而无法释放。