答えはあると思いますが、正しいかどうかはわかりません。より良いものを自由に提供するか、私がそれを釘付けにしたと思われる場合はコメント/賛成票を投じてください.
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;
同じことが当てはまります。これらのキーワードを持つことができるのは、オブジェクト ポインタだけです。したがって、ポインターへのポインターを「強い」と宣言することは無意味です。