调用[super dealloc]和调用超类'方法实现之间的区别

时间:2013-05-06 20:45:02

标签: ios objective-c inheritance

调用[super dealloc]和从超级类中获取IMP并调用它有什么区别?

Method deallocMethod = class_getInstanceMethod([self superclass], @selector(dealloc));
IMP superImp = method_getImplementation(deallocMethod);
((void (*)(id, SEL))superImp)(self, _cmd);

根据我的使用情况,我会得到两种不同的行为。我在UIViewController的动态子类中看到了这种不同的行为。

修改

详细说明。我没有使用ARC。

此外,行为上的差异很难描述,但我会尽我所能。看起来UIViewController所做的一些清理是在dealloc中没有完成。如果我只调用[super dealloc],我会收到一条消息,发送给视图控制器的解除分配的实例。当它在UIViewController的静态函数(+ [UIViewController setViewController:forView:])中增加视图的视图控制器的哈希(我不完全理解的内部)时会发生这种情况。我的猜测是,在我只调用[super dealloc]的情况下,视图控制器不会从哈希中删除。

2 个答案:

答案 0 :(得分:1)

你不要在ARC中调用[super dealloc]。否则两者都是一样的。

答案 1 :(得分:0)

我经过几个小时的谷歌搜索并浏览书页,试图调用超级版本的方法(但在编译时不知道方法的名称)。

就是这样,这一切都清除了我。除了函数指针语法之外,我已经把它正确地解决了90%。

((void (*)(id, SEL))部分就是我所缺乏的。

我正在做相当于superImp (self, _cmd)并且一直想知道它是如何工作的(调试器向我显示函数的超类版本正在执行)但是当调试器的绿线返回到原始行时我得到的电话是EXC_BAD_ACCESS (code = 1, address = well...whatever)

奇怪的事情......我记得许多年前读过关于函数指针的事情,当我遇到这个主题时,drewag的语法很有意义......但是我遇到了很多其他主题,描述了这个问题。 “抓住IMP并简单地用它来打电话”。其他主题上没有人提到有关陈述参数性质和返回类型的任何内容。

谢谢你,drewag。