在Objective C中搜索函数

时间:2012-05-14 01:15:48

标签: objective-c nskeyedarchiver nscoding

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

1 个答案:

答案 0 :(得分:2)

  

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

足够简单:你需要class_copyMethodList(),它只能获得该类的实例方法。要获取类方法,请传递类对象,例如class_copyMethodList(object_getClass([NSString class]), &count);

  

然后我需要获取每个参数的名称(最好是NSString)和每个参数的类型。

参数名称部分可能无法实现。它们没有被包含在方法的元数据中,我很确定它们根本不存在于编译中;如果他们在那里将它们从可执行文件中挖出来肯定不容易。

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

  

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

您是在谈论您为encodeWithCoder:所做的具体实施吗?您想要[coder encodeObject:firstIvar forKey:@"firstIvar"]; [coder encodeObject:secondIvar forKey:@"secondIvar"];隐含的ivars列表吗?我不确定与方法签名有什么关系,但是如果是这样的话,你可以创建一个NSCoder子类来创建一个字典,当你把它作为编码器传递给你的对象时发送encodeWithCoder: (前几天见this answer I posted)。

  

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

返回带有属性名称的数组的类方法怎么样?

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

这可能比选择运行时/类元数据要少,而且不会那么奇怪。

  

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

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