1

CLLocationCoordinate2Dを取得するメソッドがあるとします。コードでnilを直接渡すことはできません。コンパイラが文句を言います。ただし、以下はコンパイルされます。では、実行時に何が起こりますか?

CLLocation* loc = nil;
[self passMeCoordinates:loc.coordinate];
4

4 に答える 4

5

これは興味深い質問です。以前のコードは次のとおりだったと思います。

[self passMeCoordinates:nil];

CLLocationCoordinate2Dはオブジェクトではないため、コンパイラはこれについて文句を言います。これはCスタイルの構造体です。したがって、構造体が期待される場所にオブジェクト/ポインタ(nil)を渡すことはできません。(同じサイズではないなど)

コードを少し言い換えると、次のようになります。

CLLocation* loc = nil;
CLLocationCoordinate2D coord = loc.coordinate;
[self passMeCoordinates:coord];

問題は「どのような価値があるのか​​」に帰着しますcoord。ご存知かもしれませんが、Objective-Cのルールでは、メッセージをnilに送信すると(ここで行うように、loc.coordinateは[loc座標]と同等です)、0が返されます。構造体を期待していますか?先ほど申し上げたように、整数と同じサイズではありません。結果は、使用しているコンパイラによって異なります。

LLVM 3.0+(Xcode 4.2+):すべてゼロを返すので、(0,0)の座標と同等です:フレームに対してCGRectZeroを返すnil UIViewに依存できますか?

LLVM Early / GCC:構造体はガベージ/未定義のコンテンツで埋められる可能性があるため、何でもかまいません。

于 2012-12-13T23:35:45.260 に答える
1

Loc.coordinateは構造体であるため、nilを渡すことはできません。
また、C構造体を返すメソッドは、nilで呼び出すのは安全ではありません。したがって、警告は引数としてnilを渡すことではありません。

引数としてのnilについてのあなたの質問の時点で。それは方法によって異なりますが、nilを適切に処理するものもあれば、そうでないものもあります。引数としてnilを渡すことができるかできないかについては、通常、これらのメソッドのドキュメントを参照してください。

于 2012-12-13T23:31:56.553 に答える
1

他の人が指摘しているように、あなたはあなたのオブジェクトのstructプロパティを扱っているので、問題があります。オブジェクトでのみ使用する必要があります。locationnilnil

ただし、より一般的には、どのメソッドもnilパラメーターとして受け入れると想定してはなりません。それはすべて方法ごとに異なります。組み込みクラスの場合、通常、nilパラメーターが受け入れられる場合はドキュメントで指定されます。それが許容できると言われていない場合は、そうではないとnil想定するのが賢明です。

独自のコードがパラメーターを受け入れるかどうかnilは、そのパラメーターで何をするか、パラメーターを受け入れないようにする必要があるかどうか、コードが非値をnilチェックして適切に処理しているかどうかなどに完全に依存します。nil

完全にランダムな例として、次のようなメソッドがある場合:

NSMutableArray *array = [NSMutableArray array];
[array addObject:text];

NSInvalidArgumentExceptionの場合、これにより例外textが生成されnilます。

結論として、それはすべて、方法ごとに異なります。問題のメソッドのドキュメントを参照して、nil許可されているかどうかを確認してください。

「ドキュメントに記載されていない限り使用しない」ルールの一般的な例外の1つnilは、オブジェクトにメッセージを送信するときnil(つまり、オブジェクトのメソッドを呼び出すときnil)です。それは許容されます(しかし明らかに何もしません)。ドキュメントにあるように:

nilObjective-Cでは、多くの場合、悪影響を与えることなくメッセージをに送信できます。nilに送信されたメッセージからの戻り値は、返されるものがオブジェクトとして入力されている限り、機能することが保証されています。

于 2012-12-13T23:35:19.560 に答える
0

実行時に、nilがメソッドに渡されます。コンパイラはランタイムチェックを行わず、コンパイル時の型チェックのみを行います。

于 2012-12-13T23:32:31.550 に答える