このコードは時間のかかるものですが、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は、試してみて、それを解放しますので、それはあなたがそれで行われ思ったときに
は
NSZombieEnabledを有効にすることを検討してください。 –
ええと、私はこれを試して、このエラーを受け取りました: ' - [CLLocation release]:解放されたインスタンス0x6ac2090'にメッセージを送りました。 EXC_BREAKPOINT(コード= EXC_I386_BPT、サブコード= 0x0')手で座標距離を計算するのがこれより簡単かもしれません... –