我想動態地爲當前方法創建NSInvocation
,並使用正確的參數值。通常情況下,人們可能會做到這一點:Objective-C參數值的基於索引的提取
- (void)messageWithArg:(NSString *)arg arg2:(NSString *)arg2
{
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:_cmd]];
[invocation setTarget:self];
/*
* How do we set the argument values here dynamically?
*/
}
設置參數值明確是微不足道的,我們可以做這樣的事情:
[invocation setArgument:&arg atIndex:2];
[invocation setArgument:&arg2 atIndex:3];
我希望能夠與像這樣做在一個循環這個:
for(int i = 0; i < [[self methodSignatureForSelector:_cmd] numberOfArguments]; i++) {
[invocation setArgument:?!?! atIndex:i + 2];
}
困難的部分是動態獲取給定索引的參數值。
類似的問題被問here當回答者說,他不知道一個解決方案援引類的複雜性。我不同意複雜性 - 在底層代碼中,我們已經確切知道堆棧框架設置後應該如何看待堆棧,因爲編譯器知道使用的調用約定。例如,在x86與stdcall
我們可以很容易地訪問參數值,因爲我們知道他們是固定的ebp
偏移:在
- 老
ebp
0(%EBP) - 在4返回地址( %EBP)在8(%EBP
- 第一個參數)
- 等
我如何能實現我想要什麼或做真的不存在任何機制來支持的參數值基於索引取的語言?在這一點上,我可以接受這是真實的,因爲在C標準中不存在這樣的特徵。但是,我希望得到確認和/或解釋背後的推理。
都是這樣阿根廷,ARG2,ARG3,ARG4等參數的東西...? –
簽名不會是可變的,您可以假設參數類型由不可變對象或基元組成。 –
好的,但參數名稱,預計會是什麼?如果它們都像arg3那樣編號,arg4很容易做到。如果你可以把它們放在一個數組中,更容易。讓我知道。 –