【问题标题】:CLLocation causing EXC_BAD_ACCESSCLLocation 导致 EXC_BAD_ACCESS
【发布时间】: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 0x6ac2090EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0。手动计算坐标距离可能比这更容易......

标签: iphone objective-c ios automatic-ref-counting cllocation


【解决方案1】:

__bridge_transfer 将所有权转移到目标对象,这可能不是您想要在此处执行的操作,您不想要context 的所有权,因为 ARC 会尝试释放它当它认为你已经完成了它,而你不希望它这样做时。

基本上,您不想将所有权转移到任何地方,所以在这两种情况下都使用__bridge,它应该可以正常工作。

【讨论】:

  • 编译器不会接受除__bridge_transfer 之外的任何内容。它不会接受__bridge,也不会接受__bridge_retain。 ETA:当然它不会接受简单地传递currentLocation
  • 哦,等等,从头开始,我以为你在调用函数中指的是__bridge_retained。正在尝试__bridge
  • 初步结果很有希望。 :) 感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2012-07-27
  • 2016-11-19
  • 2012-10-02
  • 2011-04-14
  • 2017-03-15
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多