2013-03-19 4 views
11

私は一意のキーとしてポインタを使用する関数のペアを使用しています。私はキーとして使用する定数ポインタを宣言したい。これを行うための最も安全で明確なアプローチは何ですか?定数ポインタを宣言するための最も明白な方法は何ですか?

ここには2つの考えられる方法がありますが、いずれも短いことがあります。

  1. 自己参照ポインタ:

    static const void * const propertyKey = &propertyKey; 
    //... 
    objc_getAssociatedObject(object, propertyKey); 
    

    ダウンサイド:宣言が長いと見て怖いです!それが何であるかわからない人を簡単に混乱させることができます。 アップサイド:ハードなことが理解できたら使いやすいです。

  2. 参照する必要がある静的定数:

    static const char propertyKey; 
    //... 
    objc_getAssociatedObject(object, &propertyKey); 
    

    ダウンサイド:使用すると、変数が参照ではなく、単に使用し、欠場することは容易である(ただし、コンパイラは型の不一致としてこれを指摘しなければならないしなければなりません)。値が割り当てられるように宣言が変更された場合、ポインタの一意性が保証されなくなる可能性があるため、悲惨な影響を及ぼす可能性があります。 Upside:宣言は簡単です。

私はどちらもすぐにはわかりません。より良い提案はありますか?

+1

どの問題を解決しようとしていますか? – Sebivor

+0

私は、静的変数へのポインタをアセンブル配列のキーとして使用することには利点がないようです。なぜ静的変数を使用しないのですか? – Sebivor

+0

@modifiablelvalue 'objc_setAssociatedObject()'はキーが 'void'へのポインタである必要があるためです。 –

答えて

2

私はまた、あなたの最初のアイデアが好きです。私はちょうどそれと一緒に行くだろう。あなたの第2の考え方は、コンパイラが複数のstatic const char変数を1つにまとめる危険性があります。なぜなら、それらは常に値0を保持することが保証されているからであり、コンパイラの観点からは、そして私はあなたの最初のアイデアより良い解決策を考えることができません。

(コメント内のディスカッションから回答に持ち込まれました)

1

3:まだ意味のあるものにユニークなセットのポインタ:

static const void *const key = "PropertyKey"; 
+0

これはデバッガでもうまく見えます。 –

+11

それは文字列と同じくらいユニークです。同じ文字列が誤って2回使用された場合、衝突する可能性があります。 – JasonD

+1

記録のために、私はdownvoteをしなかった。私はちょうど観察をした。 – JasonD

関連する問題