2

このようなC文字列がある場合:

const char* str= "hello";

ポインタがconstであるため、文字列の文字を変更できないことはよく知っています。
しかし、私がこれを持っている場合:

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location

それでも、そのメソッドを使用してオブジェクトの状態を変更できます。
ポインターがNSMutableStringを指している場合でも、それを変更することができます。
では、constは何の略ですか?

4

3 に答える 3

1

違いに注意してください:

// 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];
于 2012-11-30T20:23:31.713 に答える
1

そのメソッド宣言でlocationは、は定数へのポインタCLLocationです。locationただし、オブジェクトにメッセージを送信する場合、 const-nessは保持されません。selfメッセージを処理するメソッドは、非constオブジェクトと見なされます。(これは、定数オブジェクトへのポインターconstであるメンバー関数をサポートするC ++とは異なることに注意してください。)this

したがって、constその宣言では特に有用ではありません。おそらくそれは、C++のやり方に慣れている誰かによって書かれたものでしょう。

constObjective-Cでオブジェクトポインタにアタッチされているのを見ると、通常は次のようになります。

extern NSString * const SomeConstantString;

SomeConstantStringこれは、定数でないオブジェクト(この場合は)への定数ポインターとして宣言しますNSString。ポインタ自体は一定であるため、プログラムを変更SomeConstantStringして他のNSStringオブジェクトを指すようにすることはできません。

于 2012-11-30T20:30:52.753 に答える
1

ポインタがconstであるため、文字列の文字を変更できないことはよく知っています。

いいえ、ポインタは変更可能です。それが指す文字はconstです。

それでも、そのメソッドを使用してオブジェクトの状態を変更できます。

C ++の場合のように、Objective-Cオブジェクトにはconst-correctnessはありません。コンパイラは、constオブジェクトに送信するメッセージ(変更するかどうか)を気にしません。したがって、constオブジェクトへのポインタを宣言する意味はありません。引用されたフレームワーク手法は異常であり、おそらく見落としです。

于 2012-11-30T20:31:18.190 に答える