【问题标题】:release in uitableview doesn't work, but autorelease doesuitableview 中的 release 不起作用,但 autorelease 可以
【发布时间】:2011-08-07 08:56:40
【问题描述】:

在我的

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

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

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];

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

【问题讨论】:

    标签: iphone objective-c uitableview release autorelease


    【解决方案1】:
    sDistance = [NSString stringWithFormat:@"(%.1f mi)",distance];
    sDistance = @"";
    

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

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

    NSString *sDistance;   // alloc not required
    

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

    【讨论】:

    • NSString *sDistance = nil; 将对象初始化为 nil 总是更好,因此向它们发送消息是安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2011-01-16
    • 1970-01-01
    • 2012-02-01
    • 2017-11-29
    • 2012-11-30
    相关资源
    最近更新 更多