objective-c - NSValue :getValue: strange behavior, 为什么会出现这种情况?

标签 objective-c nsinvocation

我尝试将 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:&currentVal 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/

相关文章:

ios - Audio Session 中断通知

ios - 具有主要类型和对象的 objc 可变参数

ios - 在 objective-c 中,当对象本身被分配为它实现的委托(delegate)时,对象如何返回不同的代理对象

iphone - 动态创建 uibarbutton 不起作用

ios - Xcode 8.2.1 - 错误 : Invalid bitcode version (Producer: '802.0.41.0_0' Reader: '800.0.42.1_0' )

objective-c - 计算两组坐标之间的距离(NSStrings)

ios - 解析 JSON 时无法识别的选择器

objective-c - NSOperation 内的 ASynchronous NSURLConnection 与 NSInvocation?

ios - 获取从 NSInvocationOperation 返回的结果

objective-c - 如何将参数传递给 NSTimer 中调用的方法