假设我在viewDidLoad中,并将委托属性指向self。 现在self和该属性都指向同一个对象。
是否可以存在指向同一对象的多个指针,否则会导致问题? 什么时候指针被释放?
- (void)viewDidLoad
{
someDelegate.property = self;
}
答案 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
引用的对象,该对象将保持活动状态(至少)。