如何检查 Objective-C 中的类?

2024-03-19

Update我修复了代码,以消除重写方法的重复,并通过实现来跟踪属性或方法的发起者Mark https://stackoverflow.com/questions/1890480/how-do-i-inspect-a-class-in-objective-c/1892127#1892127的建议。还没有解决财产类型(可能会从property_getAttributes()当我做)。还去掉了残留的下划线。


基本上,我需要一种方法来提醒自己给定对象上有哪些方法和属性可用,而不需要一路跳到继承树上。

我已经编写了以下函数,但还有一些不足之处:

#import <objc/runtime.h>

NSInteger inspectClass_alphabeticSort(id string1, id string2, void *reverse)
{
    if ((NSInteger *)reverse == NO)
    {
        return [string2 localizedCaseInsensitiveCompare:string1];
    }
    return [string1 localizedCaseInsensitiveCompare:string2];
}

void inspectClassStopAt(Class inspectedClass, Class stopClass)
{
    Class originalClass             = inspectedClass;
    NSString *originalClassString   = [NSString stringWithFormat:@"%@", originalClass];
    NSString *inheritancePath       = [NSString stringWithFormat:@"%@", originalClass];

    Method *methods;
    objc_property_t *properties;
    unsigned int i;
    unsigned int methodCount;
    unsigned int propertyCount;
    int reverseSort = NO;

    NSArray *sorted;
    NSArray *methodsAndPropertiesKeys;
    NSMutableDictionary * methodsAndProperties = [NSMutableDictionary dictionaryWithCapacity:10];

    NSString *inspectedClassString;
    NSString *methodOrPropertyName;
    while (inspectedClass != stopClass)
    {
        inspectedClassString = [NSString stringWithFormat:@"%@", inspectedClass];
        if (inspectedClass != originalClass)
        {
            inheritancePath = [inheritancePath stringByAppendingFormat:@" : %@", inspectedClass];
        }

        methods     = class_copyMethodList(inspectedClass, &methodCount);
        properties  = class_copyPropertyList(inspectedClass, &propertyCount);

        for (i=0; i<methodCount; i++)
        {
            methodOrPropertyName = [NSString stringWithFormat:@"-%s", sel_getName(method_getName(methods[i]))];

            if (![methodsAndProperties objectForKey:methodOrPropertyName])
            {
                [methodsAndProperties setObject:inspectedClassString forKey:methodOrPropertyName];
            }
        }

        for (i=0; i<propertyCount; i++)
        {
            methodOrPropertyName = [NSString stringWithFormat:@" %s", property_getName(properties[i])];

            if (![methodsAndProperties objectForKey:methodOrPropertyName])
            {
                [methodsAndProperties setObject:inspectedClassString forKey:methodOrPropertyName];
            }
        }

        inspectedClass = [inspectedClass superclass];
    }
    free(methods);
    free(properties);

    methodsAndPropertiesKeys = [methodsAndProperties allKeys];
    sorted = [methodsAndPropertiesKeys sortedArrayUsingFunction:inspectClass_alphabeticSort context:&reverseSort];

    NSLog(@"%@", inheritancePath);
    for (NSString *key in sorted)
    {
        if (![[methodsAndProperties objectForKey:key] isEqualToString:originalClassString])
        {
            NSLog(@"\t%@ (%@)", key, [methodsAndProperties objectForKey:key]);
        }
        else
        {
            NSLog(@"\t%@", key);
        }
    }
}

void inspectClass(Class inspectedClass)
{
    inspectClassStopAt(inspectedClass, [NSObject class]);
}

以及一些示例输出inspectClass([TextMap class]);:

TextMap : Surface
     position (Surface)
     size (Surface)
    -addChild: (Surface)
    -dealloc
    -init (Surface)
    -initWithFile:
    -position (Surface)
    -render
    -setPosition: (Surface)
    -setSize: (Surface)
    -setText:
    -size (Surface)
    -update (Surface)

随runtime.h提供的c库的一个很好的帮助器/包装器是https://github.com/mikeash/MAObjCRuntime https://github.com/mikeash/MAObjCRuntime

我刚刚开始使用它,但它看起来确实很有前途。

就用例而言,我的只是提供一个检查器来构建一个可以附加到对象图的自接线 UI。这可以减少很多潜在的重复代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查 Objective-C 中的类? 的相关文章

  • NSUndoManager 会撤消后台发生的更改吗?

    我有一个编辑视图控制器 我正在使用 NSUndoManager 它是我的持久性存储 核心数据项目 的一组 我的应用程序的功能之一是与外部服务器同步 我想知道的是 如果我正在视图中编辑某些内容 同时应用程序正在与服务器同步 如果我改变主意并决
  • 具有类类型的 Java 反射 getDeclaredMethod()

    我试图理解 Java 反射 但在使用非整数 setter 方法时遇到困难 例如 如何解析下面的 getDeclaredMethod 调用 import java lang reflect class Target String value
  • 如何确定 NSURLSessionTask 请求何时开始?

    I use NSURLSessionTask我正在尝试监视我的一些 HTTP 请求需要多长时间 我可以监视什么委托方法 或其他方法 NSURLSessionTask实际上提出了最初的请求 如果这是一个NSURLConnection里面一个N
  • iphone navigationController :在退出当前视图之前等待 uialertview 响应

    我有一个带有由导航控制器管理的后退按钮的视图 我想在用户单击后退按钮时检查文件是否已保存 如果文件已保存 您将返回到上一个视图 否则 uialertview 会询问您是否要保存文件 所以我这样做了 但视图消失了 然后警报视图出现了 void
  • ios7 绘图时出现延迟

    我有一个应用程序 在其中我正在视图上绘制一些草图 到目前为止 在我安装之前它运行良好ios7 我的应用程序使用触摸移动方法来识别运动的变化 但是当我画一条线时 触摸方法被调用 但线不会更新 直到我触摸结束ios7 所以画起来有一点点滞后 它
  • JavaScript - 这个这个

    String prototype foo String prototype foo bar function How can you reference the grandparent string console log this par
  • AVMutableComposition - 导出错误的视频转换

    导出 VideoAsset 后 问题 视频方向是不是原始变换 导出视频层似乎总是景观 尝试去 变换视频层方向 旋转至原始方向 视频层大小 使其全屏尺寸 按原始方向 一些注意事项 videoAsset 的 CGRect 从一开始就是相反的 a
  • 确定第三方应用程序在 iPhone 上播放的歌曲

    我正在尝试确定 iPhone 上当前正在播放的歌曲的标题 我知道如果本机 Apple 应用程序正在播放音乐 我可以使用以下代码来找出正在播放的内容 但如果从 Spotify 或其他音乐播放应用程序播放歌曲 我如何找到歌曲的标题 MPMedi
  • PHP 特性 - 定义通用常量

    定义可由命名空间内的多个类使用的常量的最佳方法是什么 我试图避免过多的继承 因此扩展基类不是理想的解决方案 并且我正在努力寻找使用特征的良好解决方案 这在 PHP 5 4 中是否可行 或者应该采取不同的方法 我有以下情况 trait Bas
  • iOS 8 UITableView 分隔符插入 0 不起作用

    我有一个应用程序 其中UITableView的分隔符插入设置为自定义值 右0 Left 0 这完美地适用于iOS 7 x 但是在iOS 8 0我看到分隔符插入设置为默认值15在右侧 即使在 xib 文件中它设置为0 它仍然显示不正确 我该如
  • 在 ios wifi 网络上查找对等点

    我试图弄清楚如何搜索登录到 wifi 网络且在特定端口上托管应用程序的其他设备 在不知道这些其他设备的地址甚至不知道它们托管的端口的情况下 如何检测它们的存在 一旦发现 我应该能够联系该设备并与其建立连接 最标准的 iOS方式 是使用Bon
  • 为什么我的 x 轴在 iPhone 上不显示核心图?

    编辑 我认为我的问题更好地表述为 我怎样才能有一个不从零开始的 Y 轴 看起来 x 轴总是放置在 y 0 处 但我希望 x 轴位于 y 轴上的某个正数 这是一张包含更多常规数据的图表 我只是希望将 x 轴放置在绘图的最小 y 值 大约 77
  • 动态框架中未定义的架构符号

    我正在开发一个 iOS 框架 该框架包含多个第三方框架并使用 UnitySendMessage C 方法与 Unity 进行通信 我想创建一个动态框架 支持 iOS8 但我偶然发现以下编译错误 Undefined symbols for a
  • iOS 中的视频可以进行反卷积吗?

    我想拍摄击球手挥动棒球的镜头 但球棒很模糊 视频为 30 fps 通过研究 我发现反卷积似乎是最小化运动模糊的方法 但我不知道是否或如何在我的 iOS 应用程序后处理中实现它 我希望有人能给我指出正确的方向 比如如何在 iOS 中应用反卷积
  • 如何声明仅调试语句

    在 C 中 我可以使用以下代码来获得仅在调试构建期间执行的代码 我如何在 Xcode 中执行相同的操作 if DEBUG etc etc endif 您可以使用 ifdef DEBUG endif 你需要添加DEBUG 1到调试配置设置中项
  • Objective C - 动态属性的respondsToSelector

    我目前面临的问题是检查对象 NSManagedObject 的属性是否存在 不幸的是方法 MyObject class respondsToSelector selector myProperty 总是返回NO 我认为这是因为CoreDat
  • UICollectionView 装饰和补充视图无法移动

    In UICollectionView装饰和补充意见似乎是一个很大的谜团 目前似乎几乎没有示例代码 我设法让这两种类型在自定义布局中工作 请参阅此post https stackoverflow com questions 12810628
  • Xcode 4:获取请求模板变量?

    在 Xcode 3 X 中 您应该右键单击获取请求模板的谓词编辑器中的空白来指定变量输入而不是硬编码谓词 这是 XCode 4 中的哪里 我已经按住了选项 右键单击 选项单击等 但无法弄清楚 我认为X4不再有变量了 相反 我认为您必须选择一
  • iOS图片上的线测量

    我需要一些帮助来开始绘制末端带有圆圈的线条 并测量其长度 我能够划清界限 但无法让它移动 花了几个小时决定在 SO 上发布 因此 请参阅下图并指导我开始 任何使用 Objective C 的示例或教程都会有帮助 谢谢 这个想法看起来实现起来
  • NSDate 休息 5 小时

    我运行以下代码 NSDate now NSDate 日期 NSLog now now 并得到 2011 09 16 16 14 16 434 iSavemore 1229 7907 现在 2011 09 16 21 14 16 0000 如

随机推荐

  • 在“功能”选项卡上添加背景模式

    我使用的是 Xcode 6 3 我刚刚在功能选项卡上添加了蓝牙背景模式 需要执行一个步骤 即 将 所需的背景模式 键添加到您的 info plist 文件中 然而苹果文档 https developer apple com library
  • BeautifulSoup soup.prettify() 给出奇怪的输出

    我正在尝试解析一个网站 稍后我将在我的 Django 项目中使用它 为此 我使用 urllib2 和 BeautifulSoup4 然而 我却没能得到我想要的 BeautifulSoup 对象的输出很奇怪 我尝试了不同的页面 它有效 输出正
  • 在 Scala 2.10 中获取 java.lang.Class[T] 的 Scala 类型

    我在看scala 反射概述 http docs scala lang org overviews reflection overview html我想知道是否可以使用java lang Class
  • Python numpy 减法没有负数(4-6 给出 254)

    我想减去2gray人脸彼此之间可以看到差异 但我遇到了一个问题 例如减去 4 6 给出 254 而不是 2 或差值 2 print type face
  • 检查 JQuery 中的单选按钮

    我需要以编程方式检查单选按钮的值 该表格有一个id并且输入类型显然有一个名称 但没有 id 到目前为止 我成功运行的唯一代码是 input name my name eq 1 attr checked checked 但我希望能够通过明确提
  • 多个resque工作模式创建额外的进程

    我需要启动 4 个 resque 工作人员 所以我使用了以下命令 bundle exec rake environment resque workers RAILS ENV production COUNT 4 QUEUE VERBOSE
  • Python 中的调用是如何工作的? [复制]

    这个问题在这里已经有答案了 对于我正在开发的一个项目 我正在实现一个链表数据结构 它基于对的概念 我将其定义为 class Pair def init self name prefs score self name name self sc
  • d3.js 中的地理图表

    我正在寻找一些指导或示例如何在 d3 js 中制作地理图表 我需要类似的东西this one https developers google com chart interactive docs gallery geochart在谷歌图表中
  • ESB 应该如何打包/部署?

    我正在尝试了解 Apache Camel 它似乎是一个轻量级的 ESB 如果我正确理解 Camel ESB 那么您可以将 Camel Route 视为节点和边的图 每个节点都是路由上的端点 可以消耗 产生消息 每条边都是两个不同端点 1 个
  • 为什么模态/非模态对话框称为模态/非模态?

    我总是很难记住模态对话框还是非模态对话框是否会阻止应用程序其他部分的操作 有谁知道为什么这样称呼他们 使用模式对话框 您可以将应用程序设置为特定的mode 如果您愿意 可以选择不同的 状态 仅接受与该 模式 相关的操作 从而防止对话框之外的
  • 读取文件时 Bash 用户提示

    我试图在 Bash 中逐行读取文件时创建用户提示 我的想法是使用 Gnuplot 逐一绘制各种文件 这是我所拥有的 bin bash echo Enter filename that contains the filenames read
  • 轻量级正则表达式解析器

    我想使用正则表达式解析器来帮助 C 应用程序中的一些字符串处理 我理想地寻找轻量级和开源的东西 目标平台是嵌入式系统 因此我们希望尽可能节省内存消耗 我在网上找到了许多选项 但想知道是否有人可以提出可能在这种特定情况下有所帮助的其他建议 非
  • Android 通过电报发送消息?

    我已经安装了 telegram 应用程序 只想通过 telegram 从我的应用程序向联系人发送消息 字符串 我所发现的只是这个问题 如何通过电报发送 Intent https stackoverflow com questions 216
  • 使用 SaxParser 解析 XML 文档时出现问题 - 2047 个字符限制?

    我创建了一个扩展 SaxParser DefaultHandler 类的类 我的目的是将 XML 输入存储在一系列对象中 同时保留原始 XML 数据的数据完整性 在测试过程中 我注意到一些节点数据在输入时被任意截断 例如 Input
  • 使用 OpenCV 将光栅图像转换为矢量图形?

    我正在寻找使用 OpenCV 将光栅图像转换为矢量数据的可能性 在那里我发现了一个函数cv findContours 这似乎有点原始 更可能是我没有完全理解它 它似乎仅使用黑白图像 没有灰度和彩色图像 并且似乎不接受任何可能有助于噪声图像的
  • 简单存储过程问题

    我正在 VS 2010 SQL Server 2008 中创建一个简单的存储过程 如下所示 CREATE PROCEDURE ReturnPrice carID int price decimal 18 2 output AS SELECT
  • Haskell 平面图

    我是一个对 Haskell 感兴趣的初学者 我一直在尝试自己实现 flatmap gt gt 以更好地理解它 目前我有 flatmap t gt a gt t gt a flatmap flatmap f x xs f x flatmap
  • 如何强制右对齐 UITextView 中的尾随空格?

    我有一个 UITextView 可以左对齐 右对齐或居中 我注意到 如果我右对齐 textView 则 textView 中任何文本行中的任何尾随空格都会被忽略 左对齐时 前导空格不会发生这种情况 从视觉上看 这就是发生的情况 用 来可视化
  • 规范化数组方法和返回值

    是否有任何 JavaScript 数组库可以规范化数组返回值和突变 我认为 JavaScript Array API 非常不一致 有些方法会改变数组 var A 0 1 2 A splice 0 1 reduces A and return
  • 如何检查 Objective-C 中的类?

    Update我修复了代码 以消除重写方法的重复 并通过实现来跟踪属性或方法的发起者Mark https stackoverflow com questions 1890480 how do i inspect a class in obje