【问题标题】:How do I get list of all classes conform to certain protocol in Xcode 4?如何获取符合 Xcode 4 中特定协议的所有类的列表?
【发布时间】:2012-04-10 14:20:26
【问题描述】:

我是 Xcode 的新手。我想知道如何知道所有类都符合 Xcode 4.3.1 中的某些协议? 我怎么知道一个类的所有子类?

【问题讨论】:

  • 遗憾的是,即使在 2020 年使用 Xcode 12.2,这仍然不可用。另一方面,来自 JetBrains 的 AppCode 已经有这几年了。 jetbrains.com/objc/download

标签: objective-c xcode xcode4


【解决方案1】:

使用Objective-C runtime functions

  • objc_getClassList获取Classes的列表
  • class_getSuperclass-superclass 方法遍历超类链
  • class_conformsToProtocol-conformsToProtocol: 方法来检查一个类是否符合协议

【讨论】:

  • fwiw,class_conformsToProtocol-conformsToProtocol 快得多。对于拥有数千个课程的大型应用程序来说,这是一个相当大的瓶颈
【解决方案2】:
Protocol *protocol = @protocol(YourProtocol);

int numberOfClasses = objc_getClassList(NULL, 0);
Class *classList = malloc(numberOfClasses * sizeof(Class));
numberOfClasses = objc_getClassList(classList, numberOfClasses);

for (int idx = 0; idx < numberOfClasses; idx++) 
{
    Class class = classList[idx];
    if (class_getClassMethod(class, @selector(conformsToProtocol:)) && [class conformsToProtocol:protocol])
    {
        NSLog(@"%@", NSStringFromClass(class));
    }
}
free(classList);

【讨论】:

  • 我是 ObjC 编程的新手,但对 C 很了解。您是否看到任何潜在的问题 Class classList[numberOfClasses];而不是 malloc+free?
  • @Tommy 嗯,你是对的,在堆栈上分配内存会更快
  • 还有更少的可能出错的事情,这几乎总是更好。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多