我尝试将 CGRect 传递给 NSInvocation (setArgument:atIndex:)。我用 NSValue 包装它,推送到 NSArry,然后从 NSArray 获取并使用 NSValue (getValue:)。调用 (getValue:) 方法会导致声明的索引 NSInteger i 之前发生变化。谁能说说为什么会这样?
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];
当此(getValue:)
方法实现“i”的值从 2 变为类似:1130102784 时,在 (setArgument:atIndex:)
中我有一个SIGABRT 因为索引 i 越界。
那么为什么[NSValue getValue:(*void) buffer]
会改变其他变量呢?
(P.S. 我是在函数里做的所以我简化了一个例子直接初始化数组。 如果我直接设置 atIndex:2,它会完美运行。但我很伤心,我简化了一点,我需要将 i 传递给 atIndex:)
感谢 Tom Dalling(特别是)和 sergio 问题的解决。我删除这个:
void *bufferForValue;
[currentVal getValue:&bufferForValue];
[anInvocation1 setArgument:&bufferForValue atIndex:i];
然后粘贴
NSUInteger bufferSize = 0;
NSGetSizeAndAlignment([currentVal objCType], &bufferSize, NULL);
void* buffer = malloc(bufferSize);
[currentVal getValue:buffer];
[anInvocation1 setArgument:buffer atIndex:i];
谢谢。 Stackoverflow.com 对聪明人很有帮助的网站。
最佳答案
您不能将 NSRect
放入 void*
中。正确的代码是:
NSRect buffer;
[currentVal getValue:&buffer];
或者,如果您不知道 NSValue
对象的内容:
NSUInteger bufferSize = 0;
NSGetSizeAndAlignment([currentVal objCType], &bufferSize, NULL);
void* buffer = malloc(bufferSize);
[currentVal getValue:buffer]; //notice the lack of '&'
//do something here
free(buffer);
i
的值正在改变,因为您的代码导致溢出到其他堆栈分配的变量中。
关于objective-c - NSValue :getValue: strange behavior, 为什么会出现这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7036665/