1

ユーザーの位置情報の更新を受け取る方法に関するチュートリアルのほとんどを読んで従ったと思います。CoreLocation をインポートし、正しいデリゲート プロトコルを実装するクラス (UserTracker) があります。また、正しいメソッドを実装しました。問題は、このメソッドでクラスをテストするときです:

-(bool)test
{
    UserTracker * ut = [[UserTracker alloc] init];
    [ut startTracking]; 

    [NSThread sleepForTimeInterval:30];

    [ut stopTracking];

    NSLog(@"Accumulated distance is %f m", [pt sumDist]);

    return true;
}

次のエラーが表示されます。

libdispatch.dylib`dispatch_semaphore_signal:
0x1e07e02:  movl   4(%esp), %eax
0x1e07e06:  movl   $1, %ecx
0x1e07e0b:  lock                         Thread 1: EXC_BAD_ACCESS (code=2, address=0x20)
0x1e07e0c:  xaddl  %ecx, 32(%eax)
0x1e07e10:  incl   %ecx
0x1e07e11:  testl  %ecx, %ecx
0x1e07e13:  jg     0x1e07e22                 ; dispatch_semaphore_signal + 32
0x1e07e15:  cmpl   $2147483648, %ecx
0x1e07e1b:  je     0x1e07e25                 ; dispatch_semaphore_signal + 35
0x1e07e1d:  jmp    0x1e081c1                 ; _dispatch_semaphore_signal_slow
0x1e07e22:  xorl   %eax, %eax
0x1e07e24:  ret    
0x1e07e25:  ud2    

ちなみに、両方とも同じスレッドで実行されます (これは問題ですか?)。

UserTrack.m のいくつかのメソッド:

-(void)startTracking
{
    if(_isTracking)
        return;
    // Clear old data
    [_locations removeAllObjects];
    [_lm startUpdatingLocation];
    _isTracking = true;
    NSLog(@"is tracking!");
}

// Stop tracking GPS coordinates
-(void)stopTracking
{
    if (!_isTracking)
        return;
    if(_lm != nil)
        [_lm stopUpdatingLocation];
    _isTracking = false;
    NSLog(@"STOPPED TRACKING");
}

-(id)init
{
    if(self = [super init])
    {
        _isTracking = false;
        _locations = [[NSMutableArray alloc] init];
        _lm = [[CLLocationManager alloc] init];
        _lm.delegate = self;
        _lm.distanceFilter = kCLDistanceFilterNone; // whenever we move
        _lm.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
    }

    return self;
}

以下も同じクラスに実装されています。

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
// Callback: new GPS coordinate available
-(void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation

呼び出されていない...これはスレッドの問題ですか? この奇妙なセマフォ エラーが発生するのはなぜですか?

4

1 に答える 1

0

ロケーションマネージャークラスはここでテストされました:

int main(int argc, char *argv[])
{
    @autoreleasepool
    {
        // TODO: remove this class
        BPTest * bt = [[BPTest alloc] init];
        [bt runTests];
        // Above must be removed and the location test inserted directly here...

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([BPAppDelegate class]));    
    }
}

それをテストするための簡単な「ハッキー」な方法として...テストを「BPTest」クラスから完全に移動し、「UIApplicationMain」を呼び出す直前に実行しようとした場合にのみ、デリゲートメソッドは取得したように見えましたと呼ばれる...

于 2012-10-05T13:17:45.867 に答える