релиз в uitableview не работает, но авто-релиз работает - PullRequest
1 голос
/ 07 августа 2011

В моем

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

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

1 Ответ

0 голосов
/ 07 августа 2011
sDistance = [NSString stringWithFormat:@"(%.1f mi)",distance];
sDistance = @"";

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

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

NSString *sDistance;   // alloc not required

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...