【发布时间】:2012-05-04 04:00:24
【问题描述】:
此代码在某些时候有效,但有时会因 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 * 的业务持观望态度。
提前感谢您的任何建议!
【问题讨论】:
-
可能要考虑开启 NSZombieEnabled。
-
嗯,我试过了,得到了这个错误:
-[CLLocation release]: message sent to deallocated instance 0x6ac2090。EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0。手动计算坐标距离可能比这更容易......
标签: iphone objective-c ios automatic-ref-counting cllocation