调用[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]
的情况下,视图控制器不会从哈希中删除。
答案 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。