【问题标题】:Get names of private methods of AppKit classes获取 AppKit 类的私有方法的名称
【发布时间】:2012-11-03 13:09:45
【问题描述】:

我已经为此苦苦挣扎了一段时间。

有很多次我想改变控件中的一些小东西,但我不得不重新绘制整个东西来调整它。 就像 NSPathControl 一样,我只是想改变 Path Control 的背景,我最终创建了一个全新的控件,只是为了这个小调整......

Apple 使用私有方法,如下所示:

- (void)_drawContextMenuHighlightForIndexes:(NSIndexSet *)rowIndexes clipRect:(NSRect)rect;

我在 Stackoverflow-Post 中找到了这个。

我应该如何知道这些? 我不认为它们是公开的,但这更容易。 这些人是从哪里知道的? 有没有参考资料?我不需要知道任何源代码,我只需要知道私有方法的名称。

所以我的问题是,如何获取 AppKit 类的私有方法的名称?

谢谢

【问题讨论】:

  • 请注意,更改 AppKit(或任何其他系统框架)的内部结构通常会出现问题,并且存在被 App Store 拒绝的风险。出于某种原因,这些东西是私有的。
  • 我知道这一点,我会尽可能避免这种情况。

标签: objective-c xcode macos cocoa private


【解决方案1】:

可以使用Obj-C runtime functions 获取私有类方法名称。要获取类的方法列表,您可以执行以下操作:

unsigned int methodCount;
Method *methods = class_copyMethodList(theClass, &methodCount);
for (int i = 0; i < methodCount; i++) {
    Method method = methods[i];
    NSString *methodName = NSStringFromSelector(method_getName(method));
    // collect name in an array or print it.
}
free(methods);

还有一个名为class-dump 的便捷终端工具可以为您执行此操作。

【讨论】:

    【解决方案2】:

    您可以在运行时查询类具有的方法/属性/变量,或者使用来自 github 的便捷工具 (DDDump),该工具在运行时通过在 NSObject 上添加类别来执行此操作

    NSLog(@"%@", [obj dump]);
    

    未要求但在该上下文中非常有用的是 NSObjCMessageLoggingEnabled 环境变量,如果是,它允许您查看任何已完成的调度!


    哦,获取所有通知也总是一个好主意:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 2017-11-23
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      相关资源
      最近更新 更多