2014-12-02 4 views
0

Я пытаюсь запустить этот код в iOS 8, но я получаю ошибку плохого доступа в вызванном методе, это нормально работает в iOS 7. Кто-нибудь имеет представление об этом ?NSInvocation invoke дает плохой доступ в iOS 8

-(double) calcularColumna:(int) anio :(int) mes :(NSString *) columna { 
NSInvocation * invocation = [selectores objectForKey:columna]; 
if(!invocation){ 
    NSString * metodo = [NSString stringWithFormat:@"fondo%@:anio:mes:",columna]; 
    SEL selector = NSSelectorFromString(metodo); 
    if(![self respondsToSelector:selector]) { 
     return -1; 
    } 
    invocation = [NSInvocation invocationWithMethodSignature:[[self class] instanceMethodSignatureForSelector:selector]]; 
    invocation.selector = selector; 
    invocation.target = self; 

    [invocation setArgument:(__bridge void *)(self.valoresEntrada) atIndex:2]; 
    [selectores setObject:invocation forKey:columna]; 
} 
double valor = 0; 
[invocation setArgument:&anio atIndex:3]; 
[invocation setArgument:&mes atIndex:4]; 
[invocation invoke]; 
[invocation getReturnValue:&valor]; 
/* }else { 
valor = -1; 
}*/ 
return valor; 

}

Спасибо за ваши комментарии.

ответ

0
[invocation setArgument:(__bridge void *)(self.valoresEntrada) atIndex:2]; 

неправ. Вам нужно передать указатель на передаваемое значение. Что-то вроде

// I don't know the type of self.valoresEntrada, but you can use the type directly 
typeof(self.valoresEntrada) temp = self.valoresEntrada; 
[invocation setArgument:&temp atIndex:2]; 

Кроме того, если вы собираетесь хранить розарий в коллекции для использования после того, как сферу, где он создан, что вам нужно сделать [invocation retainArguments];


P.S. [[self class] instanceMethodSignatureForSelector:selector] можно записать в виде [self methodSignatureForSelector:selector]


p.p.s. Если сигнатура метода известна и фиксирована во время компиляции, вы можете напрямую использовать objc_msgSend, если вы храбры.

+0

благодарит вас за комментарий, сейчас я попробую. Я не могу использовать objc_msgSend. Я получаю сообщение о том, что он не может использоваться с компилятором C99. –

+0

Просто протестировано, и это сработало: D. Привет, друг! –