在 Objective C 中搜索函数

Posted

技术标签:

【中文标题】在 Objective C 中搜索函数【英文标题】:Searching Functions in Objective C 【发布时间】:2012-05-14 01:15:47 【问题描述】:

我有一个奇怪的任务。我需要获取一个包含目标 c 对象中所有函数的数组。然后我需要能够判断每个函数是否是类方法。然后我需要获取每个参数的名称(最好是 NSString)以及每个参数采用的类型。有没有办法做到这一点?如果没有,有谁知道如何访问在 NSCoding 协议函数中编码的键和值 -(void)encodeWithCoder:(NSCoder*)aCoder;不使用 NSKeyedArchiver?我在这里要做的是显示初始化对象所需的属性列表。我所有的对象都使用类方法来初始化自己。我正在制作一个级别编辑器,它允许我编辑对象之间不同的属性,我不想为每个对象编写 getPropertyList 和 initWithProperties 函数,因为我已经通过实现 NSCoding 协议完成了这项工作。

【问题讨论】:

Objective-C Runtime Reference 中有很多“自省”功能。然而,弄清楚如何使用它们对学生来说是一项练习。 【参考方案1】:

我需要获取一个包含目标 c 对象中所有函数的数组。然后我需要能够判断每个函数是否是类方法。

很简单:您需要class_copyMethodList(),它只为您提供该类的实例方法。要获取类方法,请传递类对象,例如class_copyMethodList(object_getClass([NSString class]), &count);

然后我需要获取每个参数的名称(最好是NSString)以及每个参数所采用的类型。

参数名称部分可能是不可能的。它们不包含在方法的元数据中,我很确定它们根本无法在编译后存活;如果它们存在,将它们从可执行文件中挖掘出来肯定不容易。

但是,可以通过两个运行时函数之一轻松访问这些类型:method_getTypeEncoding(),它为您提供方法的返回和参数的signature string,或者method_getArgumentType(),它可以让您循环参数类型(返回的字符串使用与完整类型字符串相同的代码)。

如果没有,有谁知道如何在不使用NSKeyedArchiver 的情况下访问NSCoding 协议函数-(void)encodeWithCoder:(NSCoder*)aCoder 中编码的键和值?

您是在谈论您为encodeWithCoder: 所做的特定实现吗?您想要[coder encodeObject:firstIvar forKey:@"firstIvar"]; [coder encodeObject:secondIvar forKey:@"secondIvar"]; 隐含的 ivars 列表吗?我不确定这与方法签名有什么关系,但如果是这样,您可以创建一个 NSCoder 子类,当您将其作为编码器传递并将encodeWithCoder: 发送到您的对象时创建一个字典(请参阅@987654325 @前几天)。

我在这里要做的是显示初始化对象所需的属性列表。

返回带有属性名称的数组的类方法呢?

+ (NSArray *)essentialPropertyNames 
    return [NSArray arrayWithObjects:@"firstIvar", @"secondIvar", nil];

这可能会比挑选运行时/类元数据更省力,而且不会有任何奇怪。

我所有的对象都使用类方法来初始化自己。

这听起来不寻常。在 Cocoa 中,实例应该使用某种形式的 -init 来进行初始化。

【讨论】:

参数名称可以从选择器中推断出来,可以使用method_getName()访问。同样[NSString class] 返回一个Class 类型,object_getClass() 需要一个id 参数。不需要调用 object_getClass()。 我会说“猜测”而不是“推断”(因为它们实际上可以是任何东西),但这是一个很好的观点。 是的,它当然不完美,但我相信它是最好的。 感谢您解决了我的问题。我可以根据每个人想要的类型来确定参数名称。不要担心 NSCoding 的事情。 @mttrb:错过了您之前评论的最后一部分。您必须使用object_getClass() 来获取元类对象,其“实例方法”是原始类的类方法。 Class 也是一个对象,可以放入 id 变量中。

以上是关于在 Objective C 中搜索函数的主要内容,如果未能解决你的问题,请参考以下文章

Objective c - 按单词搜索

Objective-C iOS应用程序中的C风格函数[关闭]

Objective-C - 根据用户输入的查询搜索街道

Objective C中的两个数组中的字符串搜索

如何在 Objective C 中解析 JSON 格式

在Objective C中使用iBeacon查找距离