1

ユーザーが場所を選択して、別の画面でテストしたい場合は、次のようにします。

 if (myManager.centerOfMap == (id)[NSNull null]) {
        self.centerOfMap = myManager.centerOfMap;
    } 

ただし、ポインタ変換の警告が表示されるため、上記が正しくないことはわかっています。

それから私はやろうとしました:

 if (CLLocationCoordinate2DIsValid(*(myManager.centerOfMap))) {
        self.centerOfMap = myManager.centerOfMap;
    } 

ただし、myManager.centerOfMapが最初に設定されていないため、EXC_BAD_ACCESSが原因でプログラムがクラッシュします。CLLocationCoordinate2Dに値が割り当てられているかどうかを通知するようにするにはどうすればよいですか?

4

3 に答える 3

2

NSNullは実際には (シングルトン) オブジェクトであることに注意してください。アイデアは、null 値オブジェクトが必要な場合 (つまり、nil 値またはポインターだけを使用できない場合) に使用することです。たとえば、NSDictionary. ここで探しているものではありません。

centerOfMapが として作成された場合、CLLocationCoordinate2Dこれは単純な構造であり、オブジェクトではありません。次のように作成することに注意してください。

CLLocationCoordinate2D centerOfMap;

このようではありません:

CLLocationCoordinate2D *centerOfMap;

CLLocationCoordinate2D 構造体は次のように定義されます。

typedef struct {
    CLLocationDegrees latitude;
    CLLocationDegrees longitude;
} CLLocationCoordinate2D;

したがって、これの特定の値が適切かどうかを知りたい場合は、次のいずれかを実行する必要があります。

1) 有効な場所が追加されたかどうかを示す別のメンバー変数を用意します。たとえば、BOOL retrievedCenterOfMap. 次に、centerOfMap を構成するときにこれを YES に設定すると、テストは次のようになります。

if ([myManager retrievedCenterOfMap]) {
    self.centerOfMap = myManager.centerOfMap;
} 

2) 変数に既知の無効な値を設定しますcenterOfMap。 値が有効な座標であるかどうかという点で有効かどうかがわかりますが、実際に設定したかどうかとは区別する必要がありますCLLocationCoordinate2DIsValid()centerOfMap問題は、どの無効な値を使用する必要があるかということであり、将来コードをチェックする人は、ここで何をしたかを知ることができます。

于 2012-07-19T17:45:40.327 に答える
2

やってみました:

if (CLLocationCoordinate2DIsValid(myManager.centerOfMap)) {
    self.centerOfMap = myManager.centerOfMap;
}

また、クラスでは、クラスの初期化時に無効な値myManagerを設定する必要がある場合があります。そうすれば、無効な値で始まることが確実にわかります。centerOfMapCLLocationCoordinate2D

于 2012-07-19T17:38:15.530 に答える
0

あなたは言いませんでしたが、私はあなたがそれを渡しているので、CLLocationCoordinate2DIsValidそれmyManager.centerOfMapは typeであると思います(CLLocationCoordinate2D *)CLLocationCoordinate2DObjective-C オブジェクトではなく構造体です。myManager.centerOfMap本当にポインタである場合は、CLLocationCoordinate2D最初にそれが NULL でないことを確認してから、有効であることを確認する必要があります。

 if (myManager.centerOfMap && CLLocationCoordinate2DIsValid(*(myManager.centerOfMap))) {
    self.centerOfMap = myManager.centerOfMap;
 } 

ただし、CLLocationCoordinate2D へのポインターをインスタンス変数に格納するよりも、CLLocationCoordinate2D を直接格納する方が簡単な場合があります。

于 2012-07-19T17:44:50.860 に答える