6

我知道这很少需要覆盖allocordealloc方法,但如果需要,是否可以在 iPhone 编程中使用?

4

2 回答 2

13

您可以而且确实应该(如果使用手动内存管理)覆盖dealloc以释放您持有的任何资源(完成后不要忘记调用[super dealloc])。覆盖alloc是可能的,但正如您所说,很少需要。

于 2011-09-29T11:31:47.873 回答
6

通常,alloc仅当您希望从可用实例池中分配对象,或者可能基于某些外部参数为对象分配可变数量的存储空间时,才进行覆盖。(在 C++ 中,您可以访问new参数并根据它们进行分配,但 Objective-C 不允许您访问initXXX参数。)

我从来没有尝试过这些,我怀疑它有点雷区——你需要研究结构并非常小心。

dealloc正如亚当所说,如果您的对象持有任何保留对象,您应该始终(在引用计数环境中)覆盖。

更新: 您可以做的一件有趣的事情......在 RedClass 或它的超类中,代码如下:

+(id)alloc {
    if (self == [RedClass class]) {
        return [BlueClass alloc];
    }
    else {
        return [super alloc];
    }
}

最终结果是,无论何时执行[RedClass alloc]BlueCLass 对象都会返回。(注意:据推测 BlueClass 是 RedClass 的子类,否则在返回对象后不久事情就会严重混乱。)

并不是说这样做是个好主意,但这是可能的(而且我不知道任何情况下它不能可靠地用于普通用户定义的类)。它确实有一些可能的用途。

附加说明:在某些情况下,人们可能想要使用[self isSubclassOf:[RedClass class]]而不是==(尽管这有一些严重的缺陷)。

于 2011-09-29T11:44:44.187 回答