2012-01-29 24 views
1

我想獲取當前函數的參數名稱,以便我可以準備從文件系統加載該對象(如果它不存在於當前實例中)。 (例如,如果[foo dictTest]不可用,我想將它的先前保存的plist版本加載到該ivar中)當前方法的NSInvocation getArgument總是返回null

我想通過提供作爲當前函數參數提供的ivar名稱來查找文件。

這是函數代碼:

-(NSDictionary*)getCachedDictionary:(NSDictionary*)dict{ 

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:_cmd]]; 
    NSString * firstArgument = nil; 
    [invocation getArgument:&firstArgument atIndex:2]; 
    NSLog(@"Trying to get the objects ivar %@",firstArgument); 

    // right now during testing return nil 
    return nil; 
    } 

一旦代碼到達的NSLog我收到來自firstArgument空值。

這是爲什麼?是否有可能我不得不等待完成對當前方法的調用,或者實際上最好創建一個代理函數,通過調用setArgument提供的ivar名稱來調用我的類方法,以便我可以使用像我想要的參數字符串?

非常感謝!

P.S .:在這個特殊的例子中,我不想用KVC識別伊娃並將其返回。

回答

2

您誤解了NSInvocation API。 +[NSInvocation invocationWithMethodSignature:]創建一個新的NSInvocation,該鍵被鍵入以接受由方法簽名定義的類型的參數。它不是而是返回對應於當前方法調用的NSInvocation。這是很容易明白爲什麼:

- (void)doBar:(id)bip { 
    NSLog(@"hi there!") 
} 

- (void)doFoo { 
    NSMethodSignature *sig = [self methodSignatureForSelector:@selector(doBar:)]; 
    NSInvocation *i = [NSInvocation invocationWithMethodSignature:sig]; 
} 

當您創建的doBar:方法doFoo調用,很明顯地看到,參數必須是空的,因爲doBar:還沒有被執行,從而沒有理由。將@selector(doBar:)更改爲_cmd不會奇蹟般地改變任何內容。

所以下一個問題:有一種方法可以獲得當前方法調用的NSInvocation?從來沒聽說過。 NSInvocation是一個非常複雜的類,從目前的方法構建一個將是一場噩夢。

我強烈建議找到一種不同的方法來做任何你想做的事情。

+0

嘿戴夫,非常感謝你的解釋。我當然不明白這背後的概念:)我現在所做的就是使用KVC創建成員作爲屬性。通過這個我可以創建一個方法,它接受一個字符串並檢查self是否具有該鍵的值。如果那時沒有,我會去嘗試加載之前保存的對象並將其設置爲鍵的值。這背後的想法只是有一個代理方法,可以在內部檢查成員的有效性,並在需要時從文件緩存中讀回。再次感謝! – Nonlinearsound 2012-01-30 23:41:15