2012-01-29 2 views
1

Я хочу получить имя аргументов текущей функции, в которой я состою, чтобы я мог загрузить загрузку этого объекта из файловой системы, если он отсутствует в текущем экземпляре. (например, если [foo dictTest] недоступен, я хочу загрузить его ранее сохраненную версию plist именно в это ivar)getArgument of NSInvocation текущего метода всегда возвращает 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.

Почему? Возможно ли, что мне придется ждать полного вызова этого текущего метода, в котором я есть, или на самом деле лучше создать прокси-функцию, которая неявно вызывает мой метод класса с помощью вызова, который ест имя ivar, предоставленное setArgument, так что Я могу использовать эту строку аргументов, как я хочу?

Большое спасибо!

P.S .: В этом конкретном примере я не хочу использовать KVC для идентификации ivar и возврата его.

ответ

2

Вы неправильно поняли API NSInvocation. +[NSInvocation invocationWithMethodSignature:] создает новый NSInvocation, который используется для приема аргументов типов, определенных сигнатурой метода. Он не возвращает NSInvocation, который соответствует вызову текущего метода. Это довольно легко понять, почему:

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

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

При создании вызова в doFoo для метода doBar:, очевидно, чтобы увидеть, что аргументы должны быть пустым, потому что doBar: не была выполнена, и, таким образом, нет аргументов. Изменение @selector(doBar:) на _cmd ничего не изменило бы.

Итак, следующий вопрос: is есть способ получить NSInvocation для текущего вызова метода? Не то, что я знаю из. NSInvocation - чрезвычайно сложный класс, и построение одного из текущего метода было бы кошмаром.

Я настоятельно рекомендую найти другой подход, чтобы делать то, что вы хотите.

+0

Привет, Дэйв, большое спасибо за ваше объяснение. Я, конечно же, не понял понятия, стоящего за этим :) То, что я сделал сейчас, это использовать KVC a, я создал его как свойство. Тем самым я мог бы создать метод, который берет строку и проверяет, имеет ли значение self для этого ключа. Если тогда было nil, я бы попытался загрузить ранее сохраненный объект и установить его как значение для ключа. Идея этого заключалась только в том, чтобы иметь прокси-метод, который бы внутренне проверял достоверность члена и, если нужно, перечитывал его из кеша файлов. Еще раз спасибо! – Nonlinearsound