问题在于:
我通过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;)的许多组合,但无法使其工作。 我究竟做错了什么 ?感谢。
答案 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
不会复制或取得该指针内存的所有权。