在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
),你会怎么做(一般来说)?
答案 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,我会更新答案。