Инструмент производительности - утечка - PullRequest
0 голосов
/ 27 сентября 2011

Если я тестирую свои коды с помощью инструмента повышения производительности - утечки, и она не обнаруживает утечки. Означает ли это, что коды не пропускают память?

У меня сломанный джейл iPhone, который я могу контролировать доступную память. Если кто-нибудь знает, это SBSettings. Я протестировал свое приложение с UITableView, и я вижу, что доступная память падает, когда я прокручиваю tableView. От 300 МБ до 30 МБ, где кажется, что он не может упасть дальше. Обычно это не так уж и сильно с другими приложениями, кроме игр. Я использую пользовательский UITableViewCell с 2 кнопками, 1 textView и 3 UILabels.

Итак, да. Если инструмент производительности не обнаруживает утечку, безопасен ли я?

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

    StatusTableCell *cell = (StatusTableCell *)
    [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle]
                                    loadNibNamed:@"StatusTableCell"
                                    owner:nil options:nil];
        for (id currentObjects in topLevelObjects){
            if ([currentObjects isKindOfClass:[StatusTableCell class]]){
                cell = (StatusTableCell *) currentObjects;
                break;
            }
        } 
        [cell.cancelButton addTarget:self action:@selector(cancelButton:) forControlEvents:UIControlEventTouchUpInside];
    }
     /// some other stuff
     return cell;
}

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Нет, вы не обязательно в безопасности.

Утечка памяти происходит, когда программа больше не имеет ссылки на объект. Таким образом, если объект освобожден, но объект, который он сохранил, не является (например, неправильно выпущенным в методе dealloc), вы получите утечку.

Однако, если объект-владелец никогда не освобождается сам, утечка не обнаружена.

Для поиска подобных проблем с памятью запустите инструмент выделения ресурсов. Нажмите кнопку Mark Heap и выполните какое-либо повторяемое действие в приложении (например, выберите строку в табличном представлении, чтобы поместить подробный вид в стек навигации, затем нажмите кнопку «Назад»). ). Снова нажмите кнопку Mark Heap . Затем повторите действие несколько раз. В идеале вы не должны видеть кучи и постоянных объектов между кадрами.

1 голос
/ 27 сентября 2011

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reusablecell"];

    if(!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"reusablecell"];
        [cell autorelease];

    }
//update cell here

return cell;
}
...