我尝试将 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]
改变其他变量呢?
(PS我是在函数中做的,所以我简化了一个例子并直接初始化数组。如果我直接设置atIndex:2,它就完美了。但我很伤心我简化了一点,我需要将i传递给atIndex: )
感谢汤姆达林(特别是)和塞尔吉奥问题解决了。我删除这个:
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 对聪明人很有帮助的网站。