Objective c 如何在目标C中实现类别?

Objective c 如何在目标C中实现类别?,objective-c,categories,internals,Objective C,Categories,Internals,作为程序员,我知道如何使用类别,但我很好奇它们是如何实现的。编译器是否将它们编译为来自静态初始值设定项的调用?谢谢。类别没有任何特殊的实现,它们实际上本质上是无效的 协议在运行时充当类的标记。您可以使用class\u copyProtocolList()从运行时获取类符合的协议列表。有一个同级protocol\u copyProtocolList()函数来获取协议所遵循的协议 请注意,这些方法仅返回此特定类或协议的协议列表。不是来自超类或其他协议的引用。这意味着运行时的实际查找将非常昂贵。相反,

作为程序员,我知道如何使用类别,但我很好奇它们是如何实现的。编译器是否将它们编译为来自静态初始值设定项的调用?谢谢。

类别没有任何特殊的实现,它们实际上本质上是无效的

协议在运行时充当类的标记。您可以使用
class\u copyProtocolList()
从运行时获取类符合的协议列表。有一个同级
protocol\u copyProtocolList()
函数来获取协议所遵循的协议

请注意,这些方法仅返回此特定类或协议的协议列表。不是来自超类或其他协议的引用。这意味着运行时的实际查找将非常昂贵。相反,使用
class\u conformsToProtocol()
(或
protocol\u conformsToProtocol()
)查询一致性,这些方法可以缓存结果


实际上,在运行时查询一致性很少是一个好主意。编译器通过警告验证协议一致性,如果开发人员选择忽略这些警告,那么。。。这是他们的选择,让他们来。

你可以在这里找到你想知道的关于他们如何工作的一切

运行时是完全开源的。

关于此主题的新答案

每个类都有一个方法列表,在执行方法查找时,将从头到尾扫描方法列表。如果找不到方法,则扫描超类的列表等,直到到达根类。找到的方法将被缓存,以便下次更快地查找

将类别加载到类时,类别方法列表在现有列表的前面添加了,并刷新缓存。由于列表是按顺序搜索的,这意味着在下次搜索时,categories方法将在原始方法之前找到

当类第一次被访问时,类别的设置是从静态数据惰性地完成的。如果加载带有可执行代码的捆绑包,则可以重新执行


简言之,它比
class\u replaceMethod()

低一点,你为什么要谈论协议?“它们与类别完全不同?”约书亚·温伯格(Joshua Weinberg)——没错,我真是出丑了。我百分之百确定问题是协议。该死,在正确的背景下,我希望我的答案。谢谢,那很有用。我希望我能接受多个答案,所以我只需要更新你的评论就可以了。在第一次使用之前,有没有一个好的地方可以“初始化”一个类别?我尝试了
+initialize
,但它似乎是在第一次调用category类时被调用的,因此在那里初始化category可能是不必要的,更重要的是,可能会导致无限循环。