我整天都在阅读更多有关保留周期的信息,并且开始感到困惑。所以我只想检查几件事。 (为澄清起见,我使用的是ARC)

假设我有MyFirstClassMyFirstClass具有一个指向(默认情况下)MyChildClass的实例变量:

MyChildClass *_child;


MyFirstClass也有一个吸气剂(可在.h中公开),如下所示:

-(MyChildClass *)child
{
    return _child;
}


现在让我们说我完全有另一个课程,MySecondClassMySecondClass具有指向MyFirstClass的弱实例变量,如下所示:

__weak MyFirstClass *_firstClass;


有一个同时包含MyFirstClassMySecondClass的父类,因此MySecondClass只是对MyFirstClass的弱引用,因此它不会阻止父类在需要时释放它。

MySecondClass也有自己的子类,也强烈引用了实例变量:

MySecondChildClass *_secondClassChild;


MySecondChildClass想要引用MyFirstClassMyChildClass对象。

所以我想我也在MySecondChildClass中使用了弱指针:

__weak MyChildClass *_firstClassChild;


它有一个自定义的init来设置它:

-(id)initWithFirstClassChild:(MyChildClass *)firstClassChild
{
    if(self = [super init]){
        _firstClassChild = firstClassChild;
    }
}


最后,MySecondClass中有一个创建MySecondChildClass的方法:

-(void)setupChild
{
    _secondClassChild = [[MySecondChildClass alloc] initWithFirstClassChild:_firstClass.child];
}


这都对吗?我有90%的确定这一切都很好,但我感到困惑。

当我使用_firstClass.child时会怎样呢?我应该在该方法调用的某处引用__weak吗? MySecondChildClass初始化期间如何?在设置实例变量之前,它具有指向MyChildClass的临时指针,这是否会创建我应该担心的强指针?

任何澄清将是巨大的。

最佳答案

我认为您在这里不需要任何弱引用。

我将这些对象称为P,A,A',B和B',其中:

P is an instance of your "Parent Class"
A is an instance of "MyFirstClass"
A' is an instance of "MyChildClass"
B is an instance of "MySecondClass"
B' is an instance of "MySecondChildClass"


因此,如果我正确阅读了您的问题,那么您的图片将如下所示:

  /----> A ----> A'
 /       ^       ^
P        |       |
 \       |       |
  \----> B ----> B'


如果该图片与您写的内容匹配,那么那里就没有保留周期,因此您不需要这些引用中的任何一个都是弱的。

10-06 08:33