我有一个奇怪的任务。我需要获取一个包含目标 c 对象中所有函数的数组。然后我需要能够判断每个函数是否是类方法。然后我需要获取每个参数的名称(最好是 NSString)以及每个参数采用的类型。有没有办法做到这一点?如果没有,有谁知道如何访问在 NSCoding 协议函数中编码的键和值 -(void)encodeWithCoder:(NSCoder*)aCoder; 不使用 NSKeyedArchiver?我在这里要做的是显示初始化对象所需的属性列表。我所有的对象都使用类方法来初始化自己。我正在制作一个关卡编辑器,它允许我编辑对象之间不同的属性,但我没有
1 回答
我需要获取一个包含目标 c 对象中所有函数的数组。然后我需要能够判断每个函数是否是类方法。
很简单:你想要class_copyMethodList()
,它只为你提供该类的实例方法。要获取类方法,请传递类对象,例如class_copyMethodList(object_getClass([NSString class]), &count);
然后我需要获取每个参数的名称(最好是一个
NSString
)以及每个参数采用的类型。
参数名称部分可能是不可能的。它们不包含在方法的元数据中,我很确定它们根本无法在编译后存活;如果它们在那里,将它们从可执行文件中挖掘出来肯定不容易。
但是,可以通过以下两个运行时函数之一轻松访问这些类型:要么method_getTypeEncoding()
,它为您获取方法返回和参数的签名字符串method_getArgumentType()
,要么,它将让您循环参数类型(返回的字符串使用与完整的类型字符串)。
如果没有,有谁知道如何在不使用的情况下访问
NSCoding
协议函数中编码的键和值?-(void)encodeWithCoder:(NSCoder*)aCoder
NSKeyedArchiver
您是在谈论您所做的特定实现encodeWithCoder:
吗?你想要隐含的 ivars 列表[coder encodeObject:firstIvar forKey:@"firstIvar"]; [coder encodeObject:secondIvar forKey:@"secondIvar"];
吗?我不确定这与方法签名有什么关系,但如果是这样,你可以创建一个NSCoder
子类,当你将它作为编码器传递并发送到你的对象时创建一个字典encodeWithCoder:
(参见我前几天发布的这个答案) .
我在这里要做的是显示初始化对象所需的属性列表。
一个类方法返回一个带有属性名称的数组呢?
+ (NSArray *)essentialPropertyNames {
return [NSArray arrayWithObjects:@"firstIvar", @"secondIvar", nil];
}
与挑选运行时/类元数据相比,这可能会更省力,而且不会更奇怪。
我所有的对象都使用类方法来初始化自己。
这听起来不寻常。在 Cocoa 中,实例应该使用某种形式的-init
来进行初始化。