CLLocationCoordinate2Dを取得するメソッドがあるとします。コードでnilを直接渡すことはできません。コンパイラが文句を言います。ただし、以下はコンパイルされます。では、実行時に何が起こりますか?
CLLocation* loc = nil;
[self passMeCoordinates:loc.coordinate];
CLLocationCoordinate2Dを取得するメソッドがあるとします。コードでnilを直接渡すことはできません。コンパイラが文句を言います。ただし、以下はコンパイルされます。では、実行時に何が起こりますか?
CLLocation* loc = nil;
[self passMeCoordinates:loc.coordinate];
これは興味深い質問です。以前のコードは次のとおりだったと思います。
[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:構造体はガベージ/未定義のコンテンツで埋められる可能性があるため、何でもかまいません。
Loc.coordinateは構造体であるため、nilを渡すことはできません。
また、C構造体を返すメソッドは、nilで呼び出すのは安全ではありません。したがって、警告は引数としてnilを渡すことではありません。
引数としてのnilについてのあなたの質問の時点で。それは方法によって異なりますが、nilを適切に処理するものもあれば、そうでないものもあります。引数としてnilを渡すことができるかできないかについては、通常、これらのメソッドのドキュメントを参照してください。
他の人が指摘しているように、あなたはあなたのオブジェクトのstruct
プロパティを扱っているので、問題があります。オブジェクトでのみ使用する必要があります。location
nil
nil
ただし、より一般的には、どのメソッドもnil
パラメーターとして受け入れると想定してはなりません。それはすべて方法ごとに異なります。組み込みクラスの場合、通常、nil
パラメーターが受け入れられる場合はドキュメントで指定されます。それが許容できると言われていない場合は、そうではないとnil
想定するのが賢明です。
独自のコードがパラメーターを受け入れるかどうかnil
は、そのパラメーターで何をするか、パラメーターを受け入れないようにする必要があるかどうか、コードが非値をnil
チェックして適切に処理しているかどうかなどに完全に依存します。nil
完全にランダムな例として、次のようなメソッドがある場合:
NSMutableArray *array = [NSMutableArray array];
[array addObject:text];
NSInvalidArgumentException
の場合、これにより例外text
が生成されnil
ます。
結論として、それはすべて、方法ごとに異なります。問題のメソッドのドキュメントを参照して、nil
許可されているかどうかを確認してください。
「ドキュメントに記載されていない限り使用しない」ルールの一般的な例外の1つnil
は、オブジェクトにメッセージを送信するときnil
(つまり、オブジェクトのメソッドを呼び出すときnil
)です。それは許容されます(しかし明らかに何もしません)。ドキュメントにあるように:
nil
Objective-Cでは、多くの場合、悪影響を与えることなくメッセージをに送信できます。nilに送信されたメッセージからの戻り値は、返されるものがオブジェクトとして入力されている限り、機能することが保証されています。
実行時に、nilがメソッドに渡されます。コンパイラはランタイムチェックを行わず、コンパイル時の型チェックのみを行います。