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

在这个问题中,我正在寻找一种方法来确保variables是使用define定义的某种types。 但有时候我有这种情况:

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

然后我开始思考,只是为了debugging目的 ,可能会很高兴能够调用类似于:

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

问题是:你可以通过#define检查一个方法的参数是否正确(使用isKindOf ),你将如何做(一般来说)?

当你得到一个方法的参数(使用method_copyArgumentType在其他答案中提到),它返回的“types”是Ctypes(如int,float等)或只是Object(返回为“@”)。 可悲的是,不可能获得一种方法期望的Objective-Ctypes – 编译时会丢失信息。

回答这里find的类似问题。

嗯…有趣的问题。 我有一些应该工作的东西(theoratically)。

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

你可以从一个string中获得Selector:

 SEL selector = selectorFromString(@"doWork"); 

您可以使用客观的C运行时获得一个类的实例的Method对象。

 Method *m = class_getInstanceMethod(self, selector); 

你可以从下面获得一个方法的参数个数:

 method_getNumberOfArguments 

你可以使用参数types

 method_copyArgumentType 

从这里你应该可以断言。

我知道,远射 – 我没有试图运行代码。 如果我马上loginMac,我会更新答案。