当我有两个指针指向同一个对象时会发生什么?

时间:2014-08-08 14:42:49

标签: objective-c

假设我在viewDidLoad中,并将委托属性指向self。 现在self和该属性都指向同一个对象。

是否可以存在指向同一对象的多个指针,否则会导致问题? 什么时候指针被释放?

    - (void)viewDidLoad
    {
        someDelegate.property = self;
    }

1 个答案:

答案 0 :(得分:1)

拥有指向同一对象的多个指针是很正常的。

指针在超出范围时被释放。这可能不是你真正要求的,但值得探索,这样你才能理解self到底是什么。

方法viewDidLoad实际上是一个函数:

void viewDidLoad(id self, SEL _cmd)

(在这种形式下,它并没有真正称为viewDidLoad,因为这会导致名称冲突,但让我们假装它。)

您的viewDidLoad大致翻译为:

void viewDidLoad(id self, SEL _cmd)
{
    objc_msgSend(self->someDelegate, "setProperty:", self);
}

这里要理解的重要一点是self是一个函数参数。它存在于堆栈中,并在函数返回并弹出其堆栈时被销毁。 objc_msgSend()调用然后将另一个self副本作为其第三个参数推送到堆栈。 objc_msgSend()返回时,该副本将被销毁。这些是指针的副本,而不是它们指向的对象。

因此有许多指向此对象的指针,所有指针都在函数调用的正常过程中创建和销毁。

现在关于self指向的对象何时被解除分配的问题,这是基于引用计数的。当它的强引用数变为零时,它将被销毁。通常,名为delegate的内容只有弱引用。 setProperty:可能会创建一个强大的参考。因此,只要property指向self引用的对象,该对象将保持活动状态(至少)。