2011-12-09 13 views
0

id -variableには、ブロックを割り当てて後で呼び出すことができます。不透明なポインタIDでこれは動作しません(EXC_BAD_ACCESS)。Objective-C:idと不透明なポインタIDの違いは何ですか?

RestKitでは、userDataオブジェクトは "不透明なポインタ"です。今、ブロック変数を割り当てて、リクエストが終了した後にこのブロックを呼びたいと思います。しかし、このEXC_BAD_ACCESSのために動作しません。この不透明なポインタをブロックに割り当てるためのユーザーがいる可能性はありますか?

ありがとうございます!

EDIT

// this works 
id testId = ^{ 
    NSLog(@"hello"); 
}; 

testId(); 

// this doesn't - but it's important to know RestKit 
void (^postNotification)(void) = objectLoader.userData // EXC_BAD_ACCESS 
postNotification(); 

objectLoaderはタイプRKObjectLoaderRKRequestのサブクラス)のものであり、APIはuserDataについてこう述べています。An opaque pointer to associate user defined data with the request.

+0

コード例を参考にしてください。 – Joe

+0

'objectLoader.userData'は実際に何かに設定されていますか?このような不透明なポインタを定義することは、たとえばURLリクエストを処理するクラスの特定のインスタンスにコンテキストを与える非常に一般的な方法です。 – mattjgalloway

+0

はい;私はオブジェクトにブロックをラップしようとしました。例えばブロックプロパティを持つBlockObject。 'BlockObject * blockObject =(BlockObject *)objectLoader.userData;'を得るのは問題ありませんが、 'blockObject.postNotificationBlock'を試してすぐに、私は再び' EXC_BAD_ACCESS'を取得します。 BlockObjectは同じオブジェクトです(userDataから取得するかどうかを設定します)。 – swalkner

答えて

2

あなたはブロックを作成しているどのように私たちを表示する必要がありますそれをuserDataに割り当てて、確かに私の推測では、ブロックをコピーしていないので、範囲外になる:

ブロックがスタックに作成されます。つまり、それを囲む複合文(関数など)が終了すると、そのブロックはもはや有効ではありません。ブロックを生き残りたい場合は、ヒープにコピーする必要があります。

objectLoader.userData = [^{ ... } copy]; 
+0

それは、ありがとう!奇妙なことに、私はそれが強力なブロックプロパティを持つオブジェクトにブロックを割り当てるとすぐに動作するはずであると仮定していたでしょう... – swalkner

関連する問題