2012-05-02 8 views
0

このコードは時間のかかるものですが、EXC_BAD_ACCESSエラーでクラッシュすることがあります。CLLocationによってEXC_BAD_ACCESSが発生する

NSInteger compareDistance(id num1, id num2, void *context) 
{ 
    int rv; 
    //cast parameters from general type 
    CLLocation* location = (__bridge_transfer CLLocation *)context; 
    Attraction* attr1 = num1; 
    Attraction* attr2 = num2; 

    //convert to CLLocation objects and calculate distance from user current 
    CLLocation* locationAttr1 = 
    [[CLLocation alloc] initWithLatitude:attr1.latitude 
           longitude:attr1.longitude]; 
    CLLocation* locationAttr2 = 
    [[CLLocation alloc] initWithLatitude:attr2.latitude 
           longitude:attr2.longitude]; 
    CLLocationDistance distance1 = [locationAttr1 distanceFromLocation:location]; 
    CLLocationDistance distance2 = [locationAttr2 distanceFromLocation:location]; 

    //compare and rate 
    if (distance1 < distance2) 
     rv = NSOrderedAscending; 
    else if (distance1 > distance2) 
     rv = NSOrderedDescending; 
    else 
     rv = NSOrderedSame; 

    return rv; 
} 

これはNSMutableArrayを注文するコンペア機能である:

-(NSMutableArray *)getAttractionsByDistanceInCategory:(int)catID 
{ 
    [self confirmAttractions]; 

    //set up array and context to prepare for sort 
    NSMutableArray *attractionsToSort = [[NSMutableArray alloc] init]; 
    for (Attraction *a in attractions) 
    { 
     if ((catID < 0) || (catID >= 0 && a.category == catID)) 
      [attractionsToSort addObject:a]; 
    } 

    CLLocation* currentLocation = 
     [[CLLocation alloc] initWithLatitude:usersLat longitude:usersLng]; 

    //conduct sort 
    [attractionsToSort sortUsingFunction:compareDistance 
           context:(__bridge_retained void *)currentLocation]; 

    return attractionsToSort; 
} 

うーん。問題はARCになると思いますか?私はそのビジネスを__bridge_retained void *のように見ている。

アドバイスを事前にいただきありがとうございます! ARCは、試してみて、それを解放しますので、それはあなたがそれで行われ思ったときに

+1

NSZombieEnabledを有効にすることを検討してください。 –

+0

ええと、私はこれを試して、このエラーを受け取りました: ' - [CLLocation release]:解放されたインスタンス0x6ac2090'にメッセージを送りました。 EXC_BREAKPOINT(コード= EXC_I386_BPT、サブコード= 0x0')手で座標距離を計算するのがこれより簡単かもしれません... –

答えて

3
あなたがここで何をしたいのか、おそらくではありません送信先オブジェクトへ

__bridge_transfer転送の所有権は、あなたがは、context所有権を望んでいませんあなたはそれをしたくありません。

基本的に所有権をどこにも移したくないので、どちらの場合も__bridgeを使用してください。正常に動作するはずです。

+0

コンパイラはそこで '__bridge_transfer'以外のものを受け入れません。' __bridge'を受け入れず、 '__bridge_retain'を受け取ります。ETA:もちろん、' currentLocation'をそのまま渡すだけでは受け入れられません。 –

+0

Ooh、wait、scratch、呼び出し元関数で '__bridge_retained'を参照していると思いました。 –

+0

初期の結果は有望です:)あなたの提案に感謝します。 –

関連する問題