方法未添加到 methodDict

问题描述

据我所知,每次执行 "Obj compile: foo" 时,函数 foo 都会添加"Obj methodDict" 中,我尝试用一​​小段代码对其进行测试,我发现它并不总是添加...

是否有另一种方法可以找到 obj 已经编译的所有方法?像对象现在知道的所有方法一样吗?

解决方法

要获得更具体的答案,您应该提供用于测试的代码。我可以快速找到并且不会添加方法的一种代码路径是源代码编译失败时。此外,具有相同选择器的现有方法将被新编译的方法替换,因为同一个消息选择器在一个类中不能有两个方法。


要获取对象理解的所有消息选择器,您可以使用:

anObject class allSelectors

它还将包括在超类中实现的方法的选择器。

只获取在这个类中实现的选择器,而不是在超类中:

aClass selectors

要获取 CompiledMethods,您可以使用:

localMethods := OrderedCollection new.
aClass methodsDo: [:each | localMethods add: each].

allMethods := aClass allSelectors collect: [:each | aClass lookupSelector: each].

除了使用 methodsDo:,您还可以直接访问方法字典,就像您在测试代码中所做的那样,到目前为止您还没有向我们展示。


如果您正在寻找非脚本化的实用概述,您还可以使用协议浏览器或 Lexicon 工具。浏览您要查看其所有方法的类(使用系统浏览器),然后打开该类的弹出菜单并选择“浏览协议”。

System browser on the class "Class",popup menu to "browse protocol"

打开的新工具显示了该类及其所有超类的方法。您可以通过标有“仅通过”的按钮过滤到它所经过的超类。

Lexicon on the class "Class",showing methods through to the class "Behavior"