是的,alloc
是分配完成的地方。请注意,它可能会或可能不会完成,有时根本没有分配(这是一个实现细节)。分配通常发生NSObject
在alloc
.
如果分配了内存,那么链式调用dealloc
就是最终释放它的调用。
调用后不应该访问实例变量[super dealloc]
。这并不意味着如果你这样做了,你就会得到一个段错误。您可能会或可能不会出现段错误,这是未定义的行为。
但是,要记住的重要一点是,除了在 dealloc 实现本身中的调用之外,您永远不应该直接调用。Objective C 是引用计数的。当您完成一个对象时,您不会这样做。取而代之的是你它(或者如果你完成了它,但你将它返回给调用者并且不知道调用者是否会使用它)。当系统确定没有人再引用该对象时,实际调用会自动发生。dealloc
[super dealloc]
dealloc
release
autorelease
dealloc
编辑:
我会澄清有时根本没有分配。事实上,如果您调用 alloc,分配通常会发生,但 init* 方法可能会撤消它。通常,所有对alloc
的调用都应紧跟对其中一个初始化程序的调用。然而,初始化器不需要初始化self
它们接收到的。相反,他们可以摆脱它(因此释放内存)并返回一个完全不同的对象,该对象可能已分配也可能未分配。
因此,在这种情况下,分配的内存alloc
实际上是由初始化程序释放的(可能会或可能不会调用dealloc
)。并且初始化后得到的对象可能是一个静态对象,没有在堆上分配,永远不会被释放。它也可以是一个非指针(无效地址),被转换为(void*)
(aka id
) 并返回。