在dealloc的实现中,你不应该调用 超类的实现。您重写此方法以进行处置 对象的实例变量以外的资源,例如:
- (无效)的dealloc { 自由(myBigBlockOfMemory); }
上面说我们不应该调用超类的实现。但在它下面说我们应该“通过消息将超级版本的dealloc合并到超级”。所以两段之间似乎存在一些冲突。这一定是由于我错过了一些东西。希望有人能解释一下......
如果使用手动引用计数,则必须实现子类 他们自己的dealloc版本允许释放任何额外的 对象消耗的内存 - 例如动态分配的存储 对于解除分配的对象拥有的数据或对象实例变量。 在执行特定于类的释放后,使用子类方法 应该通过消息合并超类的dealloc版本 超级:
- (void)dealloc { [同伴发布]; 自由(myBigBlockOfMemory); [super dealloc]; }
答案 0 :(得分:6)
您的第一个引用是针对何时启用自动引用计数(ARC),而第二个引用是针对ARC 不启用时的引用。 ARC是SDK 5.0中提供的一项新功能,它消除了程序员需要完成的大量手动内存管理。
请参阅Transitioning to ARC Release Notes,特别是这些陈述:
如果需要管理资源,可以实现dealloc方法 除了释放实例变量。你不必(确实如此) 你不能发布实例变量......
ARC中的自定义dealloc方法不需要调用[super dealloc] (它实际上导致编译器错误)。超级链接是 自动化并由编译器强制执行。