Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Obj-C内省:方法如何引用它&x27;他打电话给我_Ios_Objective C_Selector_Introspection_Objective C Runtime - Fatal编程技术网

Ios Obj-C内省:方法如何引用它&x27;他打电话给我

Ios Obj-C内省:方法如何引用它&x27;他打电话给我,ios,objective-c,selector,introspection,objective-c-runtime,Ios,Objective C,Selector,Introspection,Objective C Runtime,这是问题的有意“分叉”: 我需要做与OP完全相同的事情,但他不需要传递任何参数,我需要。 我已经有办法调用具有多个未知参数的方法(NSInvocation)。我有一些方便的方法来做这件事,就像这样。但是,在每个类中需要重复每个方法的工作,这导致了维护问题,以及在错误的参数被传递(或以错误的顺序)到便利方法时的地狱般的调试 这本身是一个相对次要的问题,但我已经努力解决了两年,并且想解决这个问题。通过使用一行宏(比如@Michael57)调用我的便利方法,自动检查选择器(使用_cmd)和参数

这是问题的有意“分叉”:

我需要做与OP完全相同的事情,但他不需要传递任何参数,我需要。



我已经有办法调用具有多个未知参数的方法(NSInvocation)。我有一些方便的方法来做这件事,就像这样。但是,在每个类中需要重复每个方法的工作,这导致了维护问题,以及在错误的参数被传递(或以错误的顺序)到便利方法时的地狱般的调试

这本身是一个相对次要的问题,但我已经努力解决了两年,并且想解决这个问题。通过使用一行宏(比如@Michael57)调用我的便利方法,自动检查选择器(使用_cmd)和参数(使用?),并根据我的意愿调用便利方法。


请注意,这适用于具有固定参数列表而非可变参数列表的方法。所以我不确定va_args方法是否适用于检查参数

因此,无论是从代码管理的角度,还是纯粹出于技术上的好奇(如果选择器存在_cmd,那么一定有参数的东西?),我想知道如何内省标准Obj-C方法参数。


我希望这是我错过的很明显的东西。谢谢你的帮助!


编辑:一些示例代码: 我尝试做的基本目的是始终在单个线程中运行在特定实例上调用的方法。要做到这一点,我在NSObject类别中有一个类似这样的方便方法:


-(void)performSelectorInBackground:(SEL)一个选择器waitUntilDone:(BOOL)waitUntilDone和ArgumentLocations:(void*)firstArg,。。。;


它在特定的后台线程中的目标对象上运行被调用的选择器,该线程专门映射到该实例。所有这一切都只是为了避免一些否则会发生的棘手的同步问题

也许所有这些一开始都很糟糕,但我已经远远超过了。此代码集成在太多的地方。:)

“withArgumentLocations”可变参数列表是一个指针位置列表,可以同时接收标量值和常规Obj-C对象,因此,在后台使用可变数量和类型的参数调用选择器这一常见任务非常简单。


无论如何,实际用例如下所示:



-(void)loginRequestWithUsername:(NSString*)用户名和密码:(NSString*)密码{

if(![self isInBackgroundThread])
{
    [self performSelectorInBackground:@selector(loginRequestWithUsername:andPassword:) waitUntilDone:NO withArgumentLocations:&username, &password, nil];
    return;
}


[self-isInBackgroundThread]
是另一种方便的方法,用于检查当前执行线程是否为该实例的“已分配”线程

因此,这种方法对于单个方法调用很有效,但现在我想将其扩展到类中的所有方法。这有时会导致“ArgumentLocation”未正确替换或顺序不正确等问题,从而导致可怕的调试。


这就是为什么我想用一个小宏替换上面的代码块,我可以简单地将它粘贴到每个方法中,以实现我所需要的。



这就是为什么这个宏应该能够查询它自己的选择器(_cmd)和参数(使用?)然后将它们传递给我的
performSelectorInBackground:waitUntilDone:withArgumentLocations:
方法。

关于获取
NSInvocation
的第一件事是您无法实现该方法,然后
-forwardInvocation:
将使用正确构造的
NSInvocation
调用>。但我想这并没有直接的帮助,因为您需要实现该方法并在该方法中执行一些操作。但是,在
-forwardInvocation:
中,您可能要做的是调用另一个对象上的调用(“转发调用”),其中该对象上的方法执行真正的操作。然后,您还可以将调用存储在某个位置,该方法可以在必要时访问该位置。或者您可以执行“重新运行”在
-forwardInvocation:
本身中需要的逻辑。

这有帮助吗?我在调查过程中确实遇到了这个答案,但这没有帮助。我已经有了这些方法来为我做脏活。我的问题不是重复每个方法的参数包装、调用等。我希望能够创建一个宏因此,我的每个方法的代码维护成本仅为1行,因此需要自省参数。我已经有了“几乎在那里”的调度程序代码。@matt实际上我刚刚意识到我的问题并没有完全阐明我的这部分需求(我有肮脏的工作方法,我只需要找出一种方法,将它们进一步压缩为单行宏,以便于代码维护)。我会稍微编辑一下这个问题。谢谢你的提示。我认为如果你给出一个实际的示例会有所帮助。示例方法调用是什么,你打算进行什么方法调用?看看这个:…在我看来,你必须降到汇编语言的级别。也许使用
forwar会更好D职业:
,因为它为您收集参数值!是的,NSProxy或NSObject作为代理。它确实在我的脑海中出现,是一个很好的、干净的设计。但是,我想研究一种仍然使用宏的方法,并找出在技术上是否可以调查任何Obj-C方法中的任意参数,特别是当_cmd给出您可以轻松地选择选择器。但是,如果没有其他答案,我会接受这一个,因为它最接近我的设计目标,即几乎没有重复的代码(因此是维护/调试噩梦)。更正-“NSProxy或NSObject子类作为代理”