NSValue: getValue: comportamento estranho, por que isso acontece?
Tento passar o CGRect para o NSInvocation (setArgument: atIndex :). Envolvo-o pelo NSValue, empurre para o NSArry, depois vá do NSArray e use o NSValue (getValue :). A chamada do método (getValue :) causa a alteração do índice antes declarado NSInteger i. Alguém pode dizer por que isso acontece?
NSString className = @"UIButton";
Class cls = NSClassFromString(className);
cls pushButton5 = [[cls alloc] init];
CGRect rect =CGRectMake(20,220,280,30);
NSMethodSignature *msignature1;
NSInvocation *anInvocation1;
msignature1 = [pushButton5 methodSignatureForSelector:@selector(setFrame:)];
anInvocation1 = [NSInvocation invocationWithMethodSignature:msignature1];
[anInvocation1 setTarget:pushButton5];
[anInvocation1 setSelector:@selector(setFrame:)];
NSValue* rectValue = [NSValue valueWithCGRect:rect];
NSArray *params1;
params1= [NSArray arrayWithObjects:rectValue,nil];
id currentVal = [params1 objectAtIndex:0];
NSInteger i=2;
if ([currentVal isKindOfClass:[NSValue class]]) {
void *bufferForValue;
[currentVal getValue:&bufferForValue];
[anInvocation1 setArgument:&bufferForValue atIndex:i];
}else {
[anInvocation1 setArgument:¤tVal atIndex:i];
}
[anInvocation1 invoke];
Quando iss(getValue:)
método @ implementa o valor de 'i' muda de 2 para algo como: 1130102784 e em(setArgument:atIndex:)
Eu tenho um SIGABRT porque o índice i está fora dos limite
Então, por que[NSValue getValue:(*void) buffer]
alterar outras variáveis?
(PS Eu faço isso em função, então simplifiquei um exemplo e inicializei a matriz diretamente. E se eu definir diretamente atIndex: 2, funciona perfeitamente. :)
Graças a Tom Dalling (especialmente) e problema sergio resolvido. Eu excluo isso:
void *bufferForValue;
[currentVal getValue:&bufferForValue];
[anInvocation1 setArgument:&bufferForValue atIndex:i];
e cole este
NSUInteger bufferSize = 0;
NSGetSizeAndAlignment([currentVal objCType], &bufferSize, NULL);
void* buffer = malloc(bufferSize);
[currentVal getValue:buffer];
[anInvocation1 setArgument:buffer atIndex:i];
Obrigado. Stackoverflow.com site realmente útil com pessoas inteligentes.