什么是“父”和“子”对象?

时间:2014-02-01 08:22:50

标签: objective-c

我看到了一个关于引用计数的问题:

取三个对象:祖父母,父母和孩子。祖父母保留父母,父母保留孩子,孩子保留父母。祖父母释放父母。解释会发生什么

“祖父母保留父母?”

这是什么意思?像这样:

Class *grandparent = [[Grandparent alloc]init];
Class *parent = [grandparent copy];
..............

有人帮助我......

3 个答案:

答案 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个对象保持对彼此的引用并被保留时,它会创建一个保留周期,因为两个对象都试图相互保留,从而无法释放。