iPhone: UITableView протекает как Титаник! - PullRequest
3 голосов
/ 28 октября 2009

Это код моего cellForRowAtIndexPath моего UITableView

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *identificadorNormal = @"Normal";

        UITableViewCell *cell;

        cell = [tableView dequeueReusableCellWithIdentifier:identificadorNormal];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                               reuseIdentifier:identificadorNormal] autorelease];

            UILabel * myText = [[[UILabel alloc] initWithFrame:CGRectMake(5.0, 54.0, 225, 18)] autorelease];
            [myText setTextAlignment:UITextAlignmentLeft];
            [myText setBackgroundColor:[UIColor whiteColor ]];
            [myText setClipsToBounds:YES];
            [myText setFont:[UIFont systemFontOfSize:14.0]];
            [myText setTextColor:[UIColor blackColor]];
            [myText setAlpha:0.6];
            [myText setTag: 1];
            [cell addSubview:myText];

            UILabel * labelFRE = [[[UILabel alloc] initWithFrame:CGRectMake(235.0, 54.0, 80, 18)] autorelease];
            [labelFRE setTextAlignment:UITextAlignmentCenter];
            [labelFRE setBackgroundColor:[UIColor greenColor ]];
            [labelFRE setClipsToBounds:YES];
            [labelFRE setFont:[UIFont boldSystemFontOfSize:14.0]];
            [labelFRE setTextColor:[UIColor blackColor]];
            [labelFRE setAlpha:0.75];
            [labelFRE setTag: 2];
            [cell addSubview:labelFRE];
        }

        cell.imageView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
            pathForResource:[NSString stringWithFormat: @"table%d", indexPath.row] ofType:@"jpg"]];     
        NSString * preffix = [NSString stringWithFormat: @"grat%d", indexPath.row];

        UILabel *myText2 = (UILabel*)[cell viewWithTag:1];
        [myText2 setText:NSLocalizedString(preffix, @"")];

        UILabel *labelFRE2 = (UILabel*)[cell viewWithTag:2];
        [labelFRE2 setText:NSLocalizedString(@"frKey", @"")];       
        return cell;
}

Это чертовски протекает. Каждый раз, когда я прокручиваю таблицу, в список инструментов добавляются новые утечки.

Ребята, вы можете определить, почему?

спасибо за любую помощь.

EDIT

После первого раунда комментариев я изменил предыдущий код на этот

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identificadorNormal = @"Normal";

    UITableViewCell *cell;

    cell = [tableView dequeueReusableCellWithIdentifier: identificadorNormal];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
            reuseIdentifier:identificadorNormal] autorelease];

        UILabel * myText = [[UILabel alloc] initWithFrame:CGRectMake(5.0, 54.0, 225, 18)];
        [myText setTextAlignment:UITextAlignmentLeft];
        [myText setBackgroundColor:[UIColor whiteColor ]];
        [myText setClipsToBounds:YES];
        [myText setFont:[UIFont systemFontOfSize:14.0]];
        [myText setTextColor:[UIColor blackColor]];
        [myText setAlpha:0.6];
        [myText setTag: 1];
        [cell addSubview:myText];
            [myText release];

        UILabel * labelFRE = [[UILabel alloc] initWithFrame:CGRectMake(235.0, 54.0, 80, 18)];
        [labelFRE setTextAlignment:UITextAlignmentCenter];
        [labelFRE setBackgroundColor:[UIColor greenColor ]];
        [labelFRE setClipsToBounds:YES];
        [labelFRE setFont:[UIFont boldSystemFontOfSize:14.0]];
        [labelFRE setTextColor:[UIColor blackColor]];
        [labelFRE setAlpha:0.75];
        [labelFRE setTag: 2];
        [cell addSubview:labelFRE];
            [labelFRE release];
    }

    cell.imageView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
        pathForResource:[NSString stringWithFormat: @"table%d", indexPath.row] ofType:@"jpg"]];     
    NSString * preffix = [NSString stringWithFormat: @"grat%d", indexPath.row];

    UILabel *myText2 = (UILabel*)[cell viewWithTag:1];
    [myText2 setText:NSLocalizedString(preffix, @"")];

    UILabel *labelFRE2 = (UILabel*)[cell viewWithTag:2];
    [labelFRE2 setText:NSLocalizedString(@"frKey", @"")];       
    return cell;
}

утечки продолжаются. Без изменений.

Ответы [ 6 ]

2 голосов
/ 28 октября 2009

Глядя на http://imgur.com/XPRYF это не похоже на вашу утечку. Это на устройстве или в симуляторе?

Раньше у GSEvents были утечки, когда вы использовали акселерометр, но они должны были быть исправлены в 3.0.

Также попробуйте отключить NSAutoreleaseFreedObjectCheckEnabled, NSZombieEnabled и NSDebugEnabled, если кто-либо из них включен, так как он вызывал меня для профилировщика несколько раз.

Еще одна вещь, которая меня интересует, это то, почему вы настраиваете свои ячейки по-разному, в зависимости от того, выходят они из повторного использования или нет, но это отдельная проблема.

2 голосов
/ 28 октября 2009

Я бы избегал autorelease здесь, так как вы, вероятно, собираетесь создавать объекты много раз, прежде чем пул авто-выпусков получит шанс истощения. Кроме того, он не так хорош в ситуациях с высокой производительностью (например, при прокрутке таблицы).

редактировать

Я должен добавить, что в случае путаницы вместо использования autorelease здесь вы должны вместо этого сделать

myThing = [[Obj alloc] initWithWhatever];
[myThing doStuff];
[cell addSubview:myThing];
[myThing release];
0 голосов
/ 11 ноября 2009

Никогда не писал здесь раньше и не уверен, правильно ли я следую за темой. Я бы посоветовал проверить уровень оптимизации компилятора, который вы используете. С некоторыми проектами (я могу подробно рассказать позже, если этот подход поможет) такие странные проблемы, как эта, исчезают при использовании -o или -o1 Все, что выше, и кажется, что инициализированные значения переменных экземпляра не всегда можно доверять.

0 голосов
/ 28 октября 2009

Я скопировал ваш код в свой собственный проект, и он просачивается в симулятор, но не протекает ни на одном из моих устройств (iPhone 3GS, iPod Touch 2G).

Предполагая, что вы также видите проблемы в симуляторе, я предполагаю, что это просто еще одно подтверждение рекомендации Apple о том, что вы тестируете на реальном устройстве.

0 голосов
/ 28 октября 2009

Интересно, происходят ли утечки, когда UIImage загружает изображения?

Можете ли вы попробовать вместо этого +imageNamed? UIImage будет кэшировать изображения (это не с +imageWithContentsOfFile:). Если при загрузке изображений происходят утечки, это должно немного уменьшить утечку, но, вероятно, не устранит ее.

NSString *imageName = [NSString stringWithFormat: @"table%d.jpg", indexPath.row];
cell.imageView.image = [UIImage imageNamed:imageName];         
0 голосов
/ 28 октября 2009

Вы убедились, что identificadorNormal и @"normal" одинаковы? Если вы продолжаете пытаться заблокировать ячейку с идентификатором @"normal", но ее не существует, то вы создадите ячейку с идентификатором identificadorNormal. Если это не то же самое, что @"normal", то вы будете продолжать создавать новые ячейки каждый раз, когда табличное представление пытается отобразить ячейку.

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