NSMutableArray EXC_BAD_ACCESS для содержащихся объектов - PullRequest
1 голос
/ 20 марта 2011

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

Это мой код:

- (void) setObjects:(BOOL)hidden andWindow:(UIWindow *)win andTxt:(UITextView *)txt andTarget:(id) target {
    //view
    key = [win.subviews objectAtIndex:0];
    key.hidden = hidden;
    buttons = [[NSMutableArray alloc] initWithCapacity:1]; //my array
    txtsms = txt;
        [...]
}

- (void) addButton:(button *)but {
    [key addSubview:[but returnButton]];
    [buttons addObject:but];
    [but release];
}

- (void) hiddenAllKey {
    for (UIView *subview in [key subviews])
        if ((subview.tag <= startSpecialPunctuation+1)&&(subview.tag >= spaceButton+1)) 
            [subview removeFromSuperview];
}

- (void) showAllKey {   
    for(int i = 0; i < [buttons count]; ++i)
             [key addSubview:[[buttons objectAtIndex:i] returnButton]]; //this is the problem :|
}

Ответы [ 2 ]

3 голосов
/ 20 марта 2011

Как сказал Джо Блоу, это неправильно:

- (void) addButton:(button *)but {
    [key addSubview:[but returnButton]];
    [buttons addObject:but];
    [but release];
}

but не должно быть выпущено в этом методе.Точно так же это вселяет страх в мое сердце:

- (void) setObjects:(BOOL)hidden andWindow:(UIWindow *)win andTxt:(UITextView *)txt andTarget:(id) target {
    //view
    key = [win.subviews objectAtIndex:0];
    key.hidden = hidden;
    buttons = [[NSMutableArray alloc] initWithCapacity:1]; //my array

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

Попробуйте build and analyze в своем коде, исправляя все обнаруженные проблемы.Если это все еще терпит крах, отправьте обратную трассировку аварии

1 голос
/ 20 марта 2011
- (void) hiddenAllKey {
    for (UIView *subview in [key subviews])
        if ((subview.tag <= startSpecialPunctuation+1)&&(subview.tag >= spaceButton+1)) 
            [subview removeFromSuperview];
}

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

Ранее я написал в UIView категорию для удаления всего, что можно было сделать с помощью простого цикла while. Теперь, что вы пытаетесь сделать ... вы можете сделать цикл for, где вы сами управляете итеративным индексом, то есть, когда вы не удаляете, вы увеличиваете, иначе вы сохраняете его тем же.

РЕДАКТИРОВАТЬ: предложение решения:

for (int idx = 0; idx < [[key subviews] count]; )
{
    UIView *subview = [[key subviews] objectAtIndex: idx];
    if ((subview.tag <= startSpecialPunctuation + 1) && (subview.tag >= spaceButton + 1))
    {
        [subview removeFromSuperview];
    }
    else
    {
        idx++;
    }
}
...