【发布时间】:2026-01-14 07:30:02
【问题描述】:
问题来了:
我通过[NSValue valueWithPointer:] 将一个指向对象的指针传递给performSelector:withObject,例如:
// 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
...
}
我在各处尝试了许多 (*) 和 (&) 的组合,但无法正常工作。 我究竟做错了什么 ?谢谢。
【问题讨论】:
-
你在这段代码上运行过僵尸程序吗?如果您看到正在发送的消息,这可能会有所帮助。
-
很难想象为什么需要将 一个对象 包装在一个 NSValue 中作为
pointerValue以作为参数传递。这有点“代码味道”。 -
@bbum 是的,看起来是这样。我正在为自定义数据格式编写解析器,它需要在代码的几个不同区域中有多个
GVertex对象实例。通过传递一个指针,processVertex方法中的更改会反映在所有这些本地调用方法中。这样我的代码变得更加紧凑:) -
像这样通过引用传递会破坏封装并且非常脆弱。使顶点可变或将它们封装在其他东西中要好得多。
标签: objective-c pointers nsvalue