我们可以覆盖目标C中的alloc和dealloc吗?

时间:2011-09-29 11:28:18

标签: objective-c ios override dealloc alloc

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

2 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分: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的子类,或者在返回对象后很快就会出现问题。)

并不是说这样做是个好主意,但这是可能的(并且我不会随便知道任何不能为vanilla用户定义的类可靠运行的情况)。它确实有一些可能的用途。

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