2

[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].

4

2 回答 2

1

您不要在 ARC 中调用 [super dealloc]。否则两者相同。

于 2013-05-06T20:51:19.207 回答
0

经过数小时的谷歌搜索和翻阅书页,试图调用超级版本的方法(但在编译时不知道方法的名称),我来到了这里。

就是这样,这一切都为我清除了。除了函数指针语法外,我已经正确完成了大约 90%。

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

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

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

谢谢你,提拉格。

于 2013-10-24T13:14:11.757 回答