リンゴのプライベートヘッダファイルにアンダースコアを与えるの背後にある理由は何ですか
-
11-09-2019 - |
質問
私はリンゴの多くの.h(プライベートAPIの)を見てきました。変数/構造体/列挙型/クラスの大半は、接頭辞として_持っています。
#import <Foundation/NSValue.h>
#import <Foundation/NSObjCRuntime.h>
@class NSString;
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
私の質問は、
適切なもので、それらを再度強調する&typedefを与える背後にある理由は何ですか?
解決
のObjective-Cは、グローバルにオープンネームスペースがあります。これは、すべての名前が一意であることが重要です。以前の理由に加えて、アップルの埋蔵すべては自分自身の名前を強調します。これは偶然の名前の衝突を防ぐことができます。
他のヒント
これは、一般的に問題のエンティティがプライベートおよび/または内部にあり、直接あなたのコードでは使用すべきではないフラグとして使われています。私はCの古いバージョンでは匿名構造体を宣言することができなかったことを考えると、あなたはそこに置くために、「フィラー」の名前を必要に応じています。
私は不透明タイプを作成するためにだと信じています。これは、提供されたインターフェースを使用せずに内部の詳細にアクセスするタイプのクライアントを制限します。それからなどの、不透明なポインタするを通じて構造体を使用することができ、かつ配列を宣言することができ、変数Appleは、このようなタイプの背後にあるコードを変更することを決定した場合、そのソフトウェアを確実に内部実装を気にせずタイプは、再コンパイルする必要はありません。
構造体を宣言するため、typedef struct _name {...} name
を宣言するスタイルがGCC 2.0かそこらの日に戻って、あなたは匿名の構造体を持つことができませんでした。
アイバーズの名前については、単一先頭の下線は、Appleの内部コーディング規約で、正式にアップルに言えば、単一のアンダースコアで始まるすべての名前を留保します。 Appleは名前のすべての彼らのアイバーズそのようにした場合、あなたがそれをしないならば、あなたは自分の名前のいずれかと衝突しません。
残念ながら、多くのサンプルコードプロジェクトは、コードを通過するとIVAR名に先頭のアンダースコアを削除せずに、Appleの開発者向けウェブサイトで公開されています。これは、主なものは、Appleの内部の作業を、開発者がそのように自分の変数の命名の習慣にしているということで、二つの理由から発生し、他の理由は、サンプルコードプロジェクトを見直し、人々が実際にコーディング標準の施行についてはあまり気にしていないということですスタイル。