Objective c 目标C中的搜索函数

Objective c 目标C中的搜索函数,objective-c,nskeyedarchiver,nscoding,Objective C,Nskeyedarchiver,Nscoding,我有一个奇怪的任务。我需要得到一个数组,它包含一个目标c对象中的所有函数。然后我需要能够判断每个函数是否是类方法。然后我需要获得每个参数的名称(最好是NSString)以及每个参数所采用的类型。有办法做到这一点吗?如果没有,是否有人知道如何访问NSCoding协议函数-(void)encodeWithCoder:(NSCoder*)aCoder中编码的密钥和值;不使用NSKeyedArchiver?我在这里要做的是显示初始化对象所需的属性列表。我的所有对象都使用类方法来初始化它们自己。我正在制作

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

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

很简单:你想要的,这就得到了该类的实例方法。要获取类方法,请传递类对象,例如
class\u copyMethodList(object\u getClass([NSString class]),&count)

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

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

但是,这些类型可以通过两个运行时函数中的一个轻松访问:要么获取方法返回和参数的值,要么让您循环参数类型(返回的字符串使用与完整类型字符串相同的代码)

如果没有,是否有人知道如何在不使用
NSKeyedArchiver
的情况下访问
NSCoding
协议函数
-(void)encodeWithCoder:(NSCoder*)aCoder

您是在谈论为
encodeWithCoder:
所做的特定实现吗?您需要
[coder-encoder-object:firstIvar-forKey:@“firstIvar”]所暗示的IVAR列表;[编码器编码对象:secondIvar forKey:@“secondIvar”]?我不确定这与方法签名有什么关系,但如果是这样,您可以创建一个
NSCoder
子类,当您将其作为编码器传递并将
encodeWithCoder:
发送到您的对象时,该子类将创建一个字典(见前几天)

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

那个么,返回带有属性名称的数组的类方法呢

+ (NSArray *)essentialPropertyNames {
    return [NSArray arrayWithObjects:@"firstIvar", @"secondIvar", nil];
}
这可能比在运行时/类元数据中挑选要省力,也不会有什么不寻常的地方

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


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

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