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