релиз в uitableview не работает, а авторелиз работает

In my

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

Это работает просто отлично. Разве они не делают то же самое?


person Andrew Park    schedule 07.08.2011    source источник


Ответы (1)


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

В обеих строках sDistance указывает на новую строку, поэтому вы пропускаете выделенную строку в первой строке. Когда вы отправляете сообщение авторелиза, оно добавляется в пул авторелиза и, таким образом, не просачивается позже. Они не одинаковы. Когда вы выделяете, вам нужно освободить это. Отправка сообщения автоматического освобождения означает, что объект добавлен в пул автоматического освобождения и будет освобожден позже.

Вам не нужен этот alloc здесь, так как вы позже создадите автоматически освобождаемые строки. Просто объявите строку в первой строке. А также удалите [sDistance release]; в последней строке.

NSString *sDistance;   // alloc not required

На самом деле вы нигде не используете sDistance. Не похоже, что вам это нужно.

person taskinoor    schedule 07.08.2011
comment
NSString *sDistance = nil; Всегда лучше инициализировать объекты нулем, чтобы безопасно отправлять им сообщения. - person Evgeny Shurakov; 07.08.2011