1

Cocoaクラスには、ポインターのアドレスを受け入れるメソッドがあります。最も一般的な引数はNSError *、CoreData検証メソッド(とりわけ)の将来のオブジェクトのアドレスです。このようにして、指定された引数が指すアドレスの場所にカスタムオブジェクトまたは所有オブジェクトを配置することができます。

私の質問は、単純なポインタ引数でそれができないのはなぜですか?たとえば、私がメソッドを持っているとしましょう:

- (void)addObject:(id)someObject toArray:(NSMutableArray *)array;

可変配列を2番目の引数として簡単に渡し、addObject:それを呼び出すと、メソッド呼び出しの後に配列が変更されます。なぜこれがNSError *オブジェクトで行われないのですか?メソッドに渡されるポインターは、デフォルトでconstとして定義されていますか?これはアクセスを避けるためNULLですか?

4

3 に答える 3

2

NSError *オブジェクトでこれが行われないのはなぜですか?

のようなものがないのでNSMutableError。配列自体へのポインタを変更せずに配列の内容を変更できるため、この例は機能します。ただし、NSErrorインスタンスは不変であるため、を変更することはできませんNSError。そのため、必ず新しいエラーオブジェクトを作成する必要があります。また、そのエラーオブジェクトを他のデータと一緒に返したい場合は、それらの少なくとも1つをアウトパラメータ(などNSError **)を介して実行する必要があります。

メソッドに渡されるポインターは、デフォルトでconstとして定義されていますか?

いいえ。そのメソッド内でこれを行うことを歓迎します:

- (void)addObject:(id)someObject toArray:(NSMutableArray *)array {
  someObject = somethingElse;
  [array addObject:someObject];
}

ここで覚えておくべき重要なことは、メモリ内のスロット内のポインタのみを変更しているということです。対応するメモリスロットsomeObjectはスタック上の単なるスペースであり、そのスペースの内容を変更して、指定されたものとは異なる割り当てられたオブジェクトを指す値を設定します。

これはNULLへのアクセスを回避するためですか?

必要な保護はすべてNULL自分で行う必要があります。

于 2012-06-04T15:29:11.890 に答える
1

これは、NSErrorクラスが作成後にインスタンスを変更する方法を定義していないためです。ポインタ自体は変更可能ですが、変更可能でNSErrorはありません。

于 2012-06-04T15:28:08.130 に答える
0

それらはすべてプレーンなCポインタです。あなたがそれらをconstにしない限り、それらはconstではありません。Constポインターは、Objective-Cのほとんどの状況で、または多くの場合プレーンCでさえ使用するのに適していません。Constポインターは微妙な概念であり、意味と構文の複雑さは、Objective-Cスタイルのプログラミング。それらが存在することを忘れることは、おそらく最初の良い近似です。

例:NSArrayおよびNSMutableArray-constが「正しく」機能する場合はNSArrayクラスは必要ありませんが、Cの設計が原因でできません。

**-NSErrorなどの場合、渡したものを変更するのではなく、NSErrorを作成するという考え方です。つまり、インスタンスを作成する(つまり、実際のオブジェクトを変更する)には、ポインターへのポインターが必要です。 )。

于 2012-06-04T15:36:04.633 に答える