2

変数宣言でいつ使用するかを明確にするために(しゃれを意図せずに)キャストしているときに、ARCへの移行リリースノート__strongでこれらの行に出くわしました。

変数を正しく装飾する必要があります。オブジェクト変数宣言で修飾子を使用する場合、正しい形式は次のとおりです。

  ClassName * qualifier variableName;

例えば:

  MyClass * __weak myWeakReference;    
  MyClass * __unsafe_unretained myUnsafeReference;

他のバリアントは技術的には正しくありませんが、コンパイラによって「許可」されています。この問題を理解するには、http://cdecl.org/を参照してください。

これはApple側のある種の冗談だと思うが、私はそれを理解しているとは思わない。明らかに問題ではありませんが、私はそれを正しくやりたいと思います。変数宣言を正しく「装飾」することの重要性は何ですか。また、cdecl.orgはどのような点を目指していますか。

編集:明確にするために、私はなぜ書くのかを正確に理解したい

qualifier ClassName * variableName;

「技術的に正しくない」です。

4

1 に答える 1

2

答えはあると思いますが、正しいかどうかはわかりません。より良いものを自由に提供するか、私がそれを釘付けにしたと思われる場合はコメント/賛成票を投じてください.

CDecl は、同じ Web サイトからダウンロードできる C プログラムです。この質問のような問題を解決するために存在します。

C での変数宣言は、特に typedef が考慮されている場合、かなり悪名高くなる可能性があります。Unixwiz.netには、これに関する優れた紹介があります。char *(*(**foo [][8])())[];( )などの怪物も読める、役立つ紹介文がありますfoo is array of array of 8 pointer to pointer to function returning pointer to array of pointer to char

これらのルールは事実上近接です。簡単な例を考えてみましょう

const int * foo

これは、定数 int へのポインターとして foo を宣言します。でも、

int * const foo

foo を int への定数ポインターとして宣言します。微妙な違いについては、この質問で詳しく説明しています。(基本的に、最初の例では、foo が別の定数 int を指すようにすることはできますが、foo を介して定数 int を変更することはできません。2 番目の例では、foo が指す int を変更することはできますが、foo に任意の定数を指すようにすることはできません。メモリ内の他の場所)。

これらの ARC 属性を使用すると、次の構文を使用できます。

__strong NSString * myString

myView を「強力な」UIView へのポインターとして宣言します。これは無意味です。オブジェクトへのポインターのみが、ARC の下で強い (または弱いなど) という属性を持つことができます。したがって、次のように書くことをお勧めします

NSString * __strong myString

これは、他の C キーワードと一致しているためです。

私は自分自身に尋ねました: 弱いオブジェクト ポインターへの強いオブジェクト ポインターを宣言すると、たとえば NSString のように ARC の下で何が起こるか

NSString * __weak * __strong myContrivedPointer;

同じことが当てはまります。これらのキーワードを持つことができるのは、オブジェクト ポインタだけです。したがって、ポインターへのポインターを「強い」と宣言することは無意味です。

于 2012-06-03T13:42:21.957 に答える