将对象指针传递给performSelector:withObject导致EXC_BAD_ACCESS

时间:2012-08-12 18:39:21

标签: objective-c pointers nsvalue

问题在于: 我通过performSelector:withObject将指向对象的指针传递给[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
    ... 
}

我尝试了(*)和(&amp;)的许多组合,但无法使其工作。 我究竟做错了什么 ?感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

- (void)parseVertex:(GVertex *)vertex {
     [vertex setFlags:32];
}

答案 1 :(得分:1)

您放入NSValue的指针是指向指针(或指针的地址)的指针,但您正在检索它,就像它是一个普通的对象指针一样。而且,你所采用的地址指针是一个局部变量 - 该地址在新方法的上下文中将是垃圾。

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

中,这应该有效
[self performSelector:@selector(processVertex:) withObject:[NSValue valueWithPointer:vertex]];

请注意内存管理问题 - NSValue不会复制或取得该指针内存的所有权。