Каков наилучший способ размещения нескольких объектов без сбоев? - PullRequest
1 голос
/ 14 февраля 2011

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

Как правильно распределить эти объекты изображения без сбоев?

Заранее спасибо!

Вот мой текущий код

 for(start = 1; start <= limit; start++) {

     NSString *tempstring;

     if(start < 10) {
     tempstring = [NSString stringWithFormat:@"0%d", start];
     } else {
     tempstring = [NSString stringWithFormat:@"%d", start];
     }

     NSOperationQueue *queue = [NSOperationQueue new];
     NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(displayThumbs:) object:[NSString stringWithFormat:@"%d", start]];

     [queue addOperation:operation];
     [operation release];
     [queue release];

 }


- (void)displayThumbs:(NSString *)buttoninfo {

        int currentmag = [buttoninfo intValue];
        currentmag--;
        currentmag = (currentmag * 70) + 10;

        NSString *tempstring;
        if([buttoninfo intValue] < 10) {
            tempstring = [NSString stringWithFormat:@"0%@", buttoninfo];
        } else {
            tempstring = [NSString stringWithFormat:@"%@", buttoninfo];
        }   

        UIButton *magbutton = [[UIButton alloc] initWithFrame:CGRectMake(currentmag, 10, 50, 50)];
        magbutton.tag = [buttoninfo intValue];
        [magbutton setImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@_Page_%@.jpg", @"2011-02", tempstring]] forState:UIControlStateNormal];
        [magbutton addTarget:self action:@selector(gotoStory:) forControlEvents:UIControlEventTouchUpInside];
        [thumb_scoller addSubview:magbutton];

        [magbutton release];
        magbutton = nil;

    }

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

Ответ Кендалла Хельмстеттера Гелна, вероятно, даст вам лучшее единственное улучшение, хотя трудно быть уверенным, не видя больше программы и как она выполняется.

В дополнение к изменению размера изображения до отображаемого размера, некоторые другие советы:

  • выпуска изображений, которые не видны (по крайней мере, некоторые из них)

  • использовать локальный кэш на диске для ваших изображений (включая изображения с измененным размером)

  • повторное использование / обмен (в памяти) изображениями, где это возможно

  • предпочитают создавать объекты, которые не выпускаются автоматически. например, используйте alloc + init + (позже) release

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

  • профиль, чтобы определить, почему / где ваши ассигнования действительно растут.

  • если вы отправляетесь в очередь операций, которая выделяет много, возможно, вам следует сделать ее последовательной: [NSOperationQueue setMaxConcurrentOperationCount:1]

любопытство: зачем создавать очередь операций на одну итерацию?

1 голос
/ 14 февраля 2011

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

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

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

...