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

Use*_*321 6 overriding objective-c dealloc alloc ios

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

Ada*_*ght 13

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

  • 覆盖`dealloc`仍然是一个很好的做法,以防您需要在实例即将被释放时取消注册通知或删除手势识别器. (6认同)
  • 一些注意事项:`NSObject`的子类应该覆盖`allocWithZone:`而不是`alloc`,并且不能覆盖用ARC编译的代码中的`dealloc`. (3认同)
  • 更正:我应该说,"为ARC编译的代码不能调用`[super dealloc]`".它仍然可以覆盖dealloc,但很少有用. (3认同)

Hot*_*cks 6

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

我从来没有尝试过任何这个,我怀疑它有点像雷区 - 你需要研究结构并且非常小心.

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

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

+(id)alloc {
    if (self == [RedClass class]) {
        return [BlueClass alloc];
    }
    else {
        return [super alloc];
    }
}
Run Code Online (Sandbox Code Playgroud)

最终结果是,无论何时执行[RedClass alloc]BlueCLass对象都将被返回.(注意:大概是BlueClass是RedClass的子类,或者在返回对象后很快就会出现问题.)

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

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

  • Objective-C不会阻止你访问与`alloc`相关的任何东西,但是**没有`alloc`的参数(除了'self`和`_cmd`),所以你不清楚你指的是什么.如果您需要有关实例的信息(例如它们的大小),则Objective-C运行时可让您访问实现者需要知道的任何内容和所有内容. (3认同)
  • 邪恶的真棒......就像我想的那样.`[NSNumber alloc]`返回`NSPlaceholderNumber`的共享实例.`+ [NSNumber numberWithInt:100]`返回一个标记指针,无论你调用它多少次都是一样的.` - [NSNumber initWithInt:100]`返回相同的标记指针. (2认同)

归档时间:

查看次数:

7140 次

最近记录:

12 年,8 月 前