0

这就是问题所在:我将一个指向对象的指针传递给performSelector:withObjectvia [NSValue valueWithPointer:],例如:

// GVertex is NSObject subclass
GVertex *vertex = [[GVertex alloc] initWithX:5.0f andY:4.5f]];
GVertex **vertexPtr = &vertex;
// later in code when I need to process the vertex
[self performSelector:@selector(processVertex:) withObject:[NSValue valueWithPointer:vertexPtr]];

然后在我的processVertex:(NSValue *)vertexValue方法中,我想获取传递的顶点,我这样做:

- (void)parseVertex:(NSValue *)vertexValue
{
    GVertex *vertex = (GVertex *)[vertexValue pointerValue];
    ...
    [vertex setFlags:32]; <<-- This gives me EXC_BAD_ACCESS
    ... 
}

我已经尝试了许多 (*) 和 (&) 的组合,但无法让它发挥作用。我究竟做错了什么 ?谢谢。

4

2 回答 2

2

你为什么不直接传递你的vertex对象:

[self performSelector:@selector(processVertex:) withObject:vertex];

并将您的方法声明更改为:

- (void)parseVertex:(GVertex *)vertex {
     [vertex setFlags:32];
}
于 2012-08-12T18:49:12.707 回答
1

您放入的NSValue指针是指向指针的指针(或指针的地址),但您正在检索它,就好像它是一个普通的对象指针。此外,您要获取其地址的指针是一个局部变量——该地址在新方法的上下文中将成为垃圾。

如果您只是将(单个)指针存储在NSValue

[self performSelector:@selector(processVertex:) withObject:[NSValue valueWithPointer:vertex]];

但是,请注意内存管理问题——NSValue不会在该指针处复制或获取内存的所有权。

于 2012-08-12T19:25:53.927 回答