Делает ли добавление много-много подпредставлений в представление по умолчанию viewcontrollers замедлить мое приложение? - PullRequest
2 голосов
/ 31 октября 2008

У меня есть приложение, в котором я создаю множество uiviews и добавляю их в self.view UIViewController. Мое приложение работает очень медленно. Я освобождаю все свои объекты и у меня нет утечек памяти (я запустил инструмент производительности). Может кто-нибудь сказать мне, что может сделать мое приложение таким медленным? (код ниже)

[EDIT] В массиве около 30 элементов. [/ EndEdit]

Большое спасибо!

Вот код для метода loadView моего UIViewController:

- (void)loadView {

    UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    contentView.backgroundColor = [UIColor whiteColor];
    self.view = contentView;
    [contentView release]; 



    int length = 0;
    for(NSString *item in arrayTips)
    {
        length++;
        [item release];
    }
    int index = 0;
    for(NSString *item in arrayTitles)
    {
        SingleFlipView *backView = [[SingleFlipView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];



        backView.userInteractionEnabled = YES;
        backView.backgroundColor = [UIColor whiteColor];
        [backView setViewIndex:index];
        [backView setLastViewIndex:length];
        CGRect labelFrame = CGRectMake(10.0f, 0.0f, 300.0f, 30.0f);
        UILabel *backLabel = [[UILabel alloc] initWithFrame:labelFrame];
        backLabel.textAlignment = UITextAlignmentCenter;
        backLabel.userInteractionEnabled = YES;
        backLabel.text = item;
        backLabel.font = [UIFont fontWithName:@"Georgia" size:24.0f];
        backLabel.textColor = [UIColor blackColor];
        backLabel.backgroundColor = [UIColor whiteColor];

        CGRect textFrame = CGRectMake(10.0f, 30.0f, 300.0f, 110.0f);
        UITextView *tbxView = [[UITextView alloc] initWithFrame:textFrame];
        tbxView.textAlignment = UITextAlignmentCenter;
        tbxView.userInteractionEnabled = YES;
        tbxView.editable = FALSE;
        tbxView.text = [arrayTips objectAtIndex:index];
        tbxView.font = [UIFont fontWithName:@"Arial" size:14.0f];
        tbxView.textColor = [UIColor blackColor];
        tbxView.backgroundColor = [UIColor whiteColor];

        //CGRect labelFrame = CGRectMake(10.0f, 0.0f, 84.0f, 30.0f);
        UIImage *nextTip = [[UIImage imageNamed:@"NextTip.png"] retain];
        UIImageView *nextTipView = [ [ UIImageView alloc ] initWithImage:nextTip];
        nextTipView.frame = CGRectMake(230.0f, -10.0f, 84.0f, 30.0f);
        nextTipView.userInteractionEnabled = YES;


        UIImageView *view = [[ UIImageView alloc ] init];
        view.userInteractionEnabled = YES;
        if(self.sexString == @"Men")
        {
            UIImage *imgTip = [[UIImage imageNamed:@"feet_small.jpg"] retain];
            view.image = imgTip;
            view.frame = CGRectMake(0.0f, 110.0f, 416.0f, 228.0f); //59*161
            [imgTip release];
        }

        [backView addSubview:view];
        [backView addSubview:tbxView];
        [backView addSubview:backLabel];
        //[backView addSubview:nextTipView];

        [self.view addSubview:backView];
        [backView release];
        [backLabel release];
        [nextTip release];
        [nextTipView release];
        [tbxView release];
        [view release];

        index++;

        [item release];
    }


}

Ответы [ 3 ]

4 голосов
/ 31 октября 2008

Это будет зависеть от того, сколько элементов в массиве. Если вы просто добавляете один или два из них, вы не должны видеть ОГРОМНОЕ замедление; больше, и вы будете. Вы, вероятно, должны взглянуть на то, как UITableView обрабатывает свои ячейки; создавайте их только тогда, когда они действительно необходимы / используются, или, что еще лучше, создайте один из них и установите его содержимое на лету.

Несколько других заметок:

  • == не является допустимым оператором сравнения строк в Objective-C; использовать [string1 isEqualTo: string2]
  • Похоже, вы пытаетесь разместить много таких на экране одновременно, что, похоже, не имеет большого смысла.
  • похоже, что у вас есть поддельный [item release] в конце (вы никогда не сохраняете item, поэтому нет необходимости выпускать его.
  • весь первый цикл ( for(NSString *item in arrayTips)... меня пугает и смущает; элементы в NSArrays уже сохранены в массиве. Вам не нужно явно сохранять / освобождать их таким образом.
3 голосов
/ 31 октября 2008

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

Сказав это, вы, кажется, настраиваете что-то с неограниченно большим количеством просмотров, что не хорошо. Не зная, сколько записей в заголовках массивов, я не могу точно сказать, что происходит, но я подозреваю, что хотя фактическая визуальная иерархия для каждого создаваемого вами backView - это нормально, создание backView для каждого элемента в массиве и использование индексов, чтобы передняя часть спрятала все остальные за ней, приводит к слишком большому количеству просмотров.

Итак, как это проверить:

Добавьте разрыв в конец цикла for. Сделайте выпадение цикла после одной итерации и посмотрите, улучшится ли производительность. Если это так, то огромные иерархии представлений - ваша проблема. Возможно, вам придется взломать подпрограмму, которая изменяет индексы, чтобы убедиться, что она никогда не переключится на недопустимый индекс для тестирования.

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

1) Измените код в вашем цикле for на отдельный метод, который создает backView для определенного заголовка и присоединяет его к представлению в это время. 2) Где бы вы в настоящее время не изменяли индексы, чтобы сделать видимость сзади, вместо этого вызывайте новый метод, чтобы фактически построить и прикрепить вид сзади в это время

1 голос
/ 17 марта 2009

Не забудьте сделать непрозрачным как можно больше ваших видов. Прозрачные представления являются основным источником проблем с производительностью.

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