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:&currentVal 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.

questionAnswers(2)

yourAnswerToTheQuestion