在uitableview中发布不起作用,但autorelease确实如此

时间:2011-08-07 08:56:41

标签: iphone objective-c uitableview release autorelease

在我的

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

我正在计算2点之间的距离,所以我有

NSString *sDistance = [[NSString alloc] init];
if (curLat != 0) {
    if (curLong != 0) {
        double desLat = [[requestedDict objectForKey:@"latitude"] doubleValue];
        double desLong = [[requestedDict objectForKey:@"longitude"] doubleValue];
        double distance = sqrt(69.1*(desLat-curLat)*69.1*(desLat-curLat)+69.1*(desLong-curLong)*cos(curLat/57.3)*69.1*(desLong-curLong)*cos(curLat/57.3));
        sDistance = [NSString stringWithFormat:@"(%.1f mi)",distance];
        [[cell distanceLabel] setText:[NSString stringWithFormat:@"(%.1f mi)",distance]];
    }
    else{
        sDistance = @"";
        [[cell distanceLabel] setText:@""];
    }
}
[sDistance release];

当我这样做时,我会收到exc_bad_access错误,但当我将其更改为

NSString *sDistance = [[[NSString alloc] init] autorelease];

它运作得很好。他们不是做同样的事吗?

1 个答案:

答案 0 :(得分:0)

sDistance = [NSString stringWithFormat:@"(%.1f mi)",distance];
sDistance = @"";

在两行sDistance中都指向一个新字符串,因此您在第一行中泄漏了已分配的字符串。当您发送自动释放消息时,它会被添加到自动释放池中,因此不会在以后泄露。它们不一样。当你分配时,你需要释放它。发送自动释放消息表示该对象已添加到自动释放池中,稍后将被释放。

您在此处不需要此alloc,因为您稍后会创建自动释放的字符串。只需在第一行声明字符串即可。并删除最后一行中的[sDistance release];

NSString *sDistance;   // alloc not required

实际上你并没有在任何地方使用sDistance。看起来你不需要这个。