0

問題は次のとおりです。たとえば、次のように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
    ... 
}

どこでも (*) と (&) の多くの組み合わせを試しましたが、うまくいきません。私は何を間違っていますか?ありがとう。

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 に答える