Будет ли этот фрагмент кода зависать в моем приложении в случайное время? - PullRequest
0 голосов
/ 10 февраля 2012
for(UIView *view in [_scrollView subviews]) {
    NSMutableArray *_mutableArray = [_array mutableCopy];
    [_mutableArray filterUsingPredicate:[NSPredicate predicateWithFormat:@"guid like %@",view.object.guid]];
    if([_mutableArray count] != 0) {
        //object is already on screen we need to update it
        [view setObject:(Object*)[_mutableArray objectAtIndex:0]];
    }
    else {
        //object not on screen add it 
         _mutableArray = [_array mutableCopy];
        [_mutableArray filterUsingPredicate:[NSPredicate predicateWithFormat:@"guid not like %@",view.object.guid]];

        UIView *newView = [[UIView alloc] initWithObject:(Object*)[_mutableArray objectAtIndex:0]];
        [_scrollView addSubview:newView];

    }
}

Как вы можете видеть, этот метод обновляет объекты, которые отображаются на экране, и, если объект не отображается на экране, он создается и добавляется в иерархию подпредставления scrollView. Теперь меня беспокоит то, что я изменяю иерархию подпредставлений scrollView, перечисляя ее. Будет ли это в конечном итоге сбой моего приложения?

Если да, как я могу изменить приведенный выше код для обеспечения безопасности и достижения той же функциональности?

Спасибо!

1 Ответ

0 голосов
/ 10 февраля 2012

Это в конечном итоге приведет к краху моего приложения?

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

Если не задокументировано иное, изменение мутировавшей вами коллекции - плохая идея.Сначала сделайте его копию и перечислите его.

...