Objective-C中的严格类型检查第2部分

时间:2011-10-25 14:16:26

标签: objective-c ios

this question我正在寻找一种方法来确保变量是使用define的某种类型。但有时我会遇到这种情况:

- (void) theSituation:(Thinger*)thinger {
    ASSERT_IS_KIND_OF(thinger, Thinger);
    // etc. etc.

然后我开始考虑,仅用于调试目的,能够调用类似的东西可能会很好:

- (void) theSituation:(Thinger*)thinger {
    ASSERT_INPUT_PARAMS_ARE_OF_CORRECT_TYPES();
    // etc. etc.

问题是:你能通过isKindOf检查一个方法的参数是否属于正确的类型(使用#define),你会怎么做(一般来说)?

2 个答案:

答案 0 :(得分:2)

当你得到方法的参数时(使用另一个答案中提到的method_copyArgumentType),它返回的“type”是C类型(如int,float等)或只是Object(返回)作为一个 ”@”)。遗憾的是,不可能获得方法所期望的Objective-C类型 - 编译时信息会丢失。

回答here发现的类似问题。

答案 1 :(得分:1)

嗯......有趣的问题。我有一些应该工作的东西(理论上)。

您可以使用__func__获取正在执行的函数名称。 (见this)。

您可以从字符串中获取选择器:

SEL selector = selectorFromString(@"doWork");

您可以使用objective C runtime获取类实例的Method对象。

Method *m = class_getInstanceMethod(self, selector);

您可以从以下方法获取方法的参数数量:

method_getNumberOfArguments

您可以使用

获取参数类型
method_copyArgumentType

从这里你应该能够断言。

我知道,远射 - 我没有尝试过运行代码。如果我马上上Mac,我会更新答案。