違いに注意してください:
// constant pointer
char * const str = "";
// pointer to constant (two equivalent ways)
const char * str = "";
char const * str = "";
キーワードconstapplyは、そのすぐ左側にあるものすべてに適用されます。左側に何もない場合は、すぐ右側にあるものすべてに適用されます。
Objective-Cでは、すべてのメソッドパラメータは常に値で渡されます。これには、プリミティブ、構造体、共用体、ポインター、およびその他の構成された型が含まれます。
オブジェクト型の変数を持つことはできないことに注意してください。のような式NSObject o;
は、「インターフェイスタイプを静的に割り当てることはできません」というメッセージとともにコンパイラエラーを生成します。
オブジェクトを渡す唯一の方法は、ポインタを渡すことです。ポインタは値として渡されますが、メソッド内のコードがオブジェクトを参照して変更できるようにします。つまり、ある意味では、オブジェクトを参照で渡すのと同じです(実際には、ポインターを値で渡すのです)。
Objective-Cプログラムをコンパイルすると、メソッドはC関数に変換され、各「メッセージ送信」(まったく同じではありませんが「メソッド呼び出し」)はランタイム関数を使用して実行されますobjc_sendMsg
。この関数は、オブジェクトを修飾したかどうかを認識または認識しませconst
ん。不変オブジェクトが必要な場合は、オブジェクト内にその不変性をコーディングする必要があります。例:
// const qualifying an object is ignored whether in variables or method arguments:
const NSMutableArray *array = [NSMutableArray new]; // const is ignored
-(void)someMethod:(const NSMutableArray *)array { ... // const is ignored
// calling the methods that mutate the object works fine
[array removeAllObjects];