【问题标题】:Difference between calling [super dealloc] and calling the superclass' method implementation调用[super dealloc]和调用超类的方法实现的区别
【发布时间】:2013-10-24 21:47:49
【问题描述】:

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

【问题讨论】:

  • 如果您使用的是 ARC,那么所有的赌注都没有了。
  • 行为上有什么不同?当我们知道症状是什么时,就更容易解释症状了。
  • 我只是添加了更多关于行为差异的描述。我不是 100% 清楚到底有什么不同。我希望这里的答案能给我一个提示,但我已尽力描述它。
  • 你真的不应该在运输代码中做这样的事情......而且不应该有这样做的理由。
  • 我试图避免这样做,这就是为什么我试图找出不同之处。希望一旦我知道为什么它的行为不同,我就可以弄清楚如何使用普通的[super dealloc] 来修复它

标签: ios objective-c inheritance


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    就是这样,这一切都为我清除了。除了函数指针语法之外,我已经做对了大约 90%。

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

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

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

    谢谢你,提拉格。

    【讨论】:

      猜你喜欢
      • 2014-03-05
      • 2012-08-08
      • 2023-04-05
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多