在我的
- (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];
它运作得很好。他们不是做同样的事吗?
答案 0 :(得分:0)
sDistance = [NSString stringWithFormat:@"(%.1f mi)",distance];
sDistance = @"";
在两行sDistance
中都指向一个新字符串,因此您在第一行中泄漏了已分配的字符串。当您发送自动释放消息时,它会被添加到自动释放池中,因此不会在以后泄露。它们不一样。当你分配时,你需要释放它。发送自动释放消息表示该对象已添加到自动释放池中,稍后将被释放。
您在此处不需要此alloc,因为您稍后会创建自动释放的字符串。只需在第一行声明字符串即可。并删除最后一行中的[sDistance release];
。
NSString *sDistance; // alloc not required
实际上你并没有在任何地方使用sDistance
。看起来你不需要这个。