0

私は自分のlocationManagerで以下を実装しようとしました:

ユーザーの場所の更新を開始しています

- (void)startStandardUpdates {
    if (self.locationManager == nil) {
        self.locationManager = [[CLLocationManager alloc] init];
    }

    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    // Set a movement threshold for new events
    self.locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters;

    [self.locationManager startUpdatingLocation];

    CLLocation *currentLocation = self.locationManager.location;

    if (currentLocation) {
        self.currentLocation = currentLocation;
    }
}

プロパティに通知を送信するためのカスタム セッターを実装する

- (void)setCurrentLocation:(CLLocation *)currentLocation {
    self.currentLocation = currentLocation;
    NSLog(@"%f", currentLocation.coordinate.latitude);

    //Notify the app of the location change
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:self.currentLocation forKey:kIFLocationKey];
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:kIFLocationChangeNotification object:nil userInfo:userInfo];
    });
}

問題: アプリを実行すると、デバッグ モードの "setCurrentLocation" メソッドで "BAD_EXEC (コード 2)" エラー メッセージが表示され、アプリがハングアップします。しかし、私は問題を理解していません。私は何かを逃しましたか?私が見る限り、「startStandardUpdates」では、ロケーション マネージャーがユーザーの場所を見つけた場合、カスタム セッター「self.currentLocation = currentLocation」を使用して、プロパティ「currentLocation」が更新されています。

事前にご協力いただきありがとうございます。よろしくセバスチャン

4

1 に答える 1

2

セッターの実装方法が問題です。self.currentLocation = ... によってセッターが呼び出され、セッターの実装中にそれを呼び出すと、無限ループが発生します。以下のように ivar を合成し、セッター (およびゲッター) でのみ _variablename を使用します。

@synthesize currentLocation = _currentLocation;

//セッター

- (void)setCurrentLocation:(CLLocation *)currentLocation {
    _currentLocation = currentLocation;
    NSLog(@"%f", currentLocation.coordinate.latitude);

    //Notify the app of the location change
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:self.currentLocation forKey:kIFLocationKey];
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:kIFLocationChangeNotification object:nil userInfo:userInfo];
    });
}
于 2013-02-09T10:31:34.950 に答える