UIButton action EXC_BAD_ACCESS ARC - PullRequest
       10

UIButton action EXC_BAD_ACCESS ARC

1 голос
/ 02 ноября 2011

У меня есть вид прокрутки, и я добавляю виды с меткой и кнопкой изображения в вид прокрутки.Я добавляю действия к кнопке, и все выглядит нормально, когда я ее запускаю, но когда я нажимаю на кнопку, приложение вылетает с EXC_BAD_ACCESS.Я использую ARC, поэтому не уверен, что это вызывает проблемы, но это не должно.Кажется, что он не может найти мое действие, как будто что-то было выпущено из памяти.Вот мой код:

-(void)lvlSelected:(id)sender{
    NSLog(@"Selected level pack");
}

/*
 DISPLPAYPACKS
 This will take the loaded level packs and display them in the scroll view for selection
 */

-(void)displayPacks{
    //Iterate thru the installed level packs and load some tiles they can select
    for (int i = 0; i < installedLevelPacks.count; i++){ 
        levelPack *curPack = [installedLevelPacks objectAtIndex:i];
        CGFloat x = i * 110; 
        //Add the view to contain the rest of our elements
        UIView *tileView = [[UIView alloc] initWithFrame:CGRectMake(x, 0, 100, 125)]; 
        //view.backgroundColor = [UIColor greenColor]; 
        //Add a label to the bottom to hold the title
        UILabel *titleLbl = [[UILabel alloc] initWithFrame:CGRectMake(0, tileView.frame.origin.y+100, 100, 25)];
        titleLbl.textAlignment=UITextAlignmentCenter;
        titleLbl.font=[UIFont fontWithName:@"American Typewriter" size:12];
        titleLbl.adjustsFontSizeToFitWidth=YES;
        titleLbl.text=curPack.title;
        //Add the preview image to the tile
        UIImageView *previewImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:curPack.previewImg]];
        previewImg.frame=CGRectMake(0, 0, 100, 100);
        //Add the button over the tile
        UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom];
        aButton.frame = CGRectMake(0, 0, 100, 125);
        //Set the tag to the level ID so we can get the pack later
        [aButton setTag:i];
        [aButton setTitle:curPack.title forState:UIControlStateNormal];
        [aButton addTarget:self action:@selector(lvlSelected:) forControlEvents:UIControlEventTouchUpInside];

        [tileView addSubview:previewImg];
        [tileView addSubview:titleLbl];
        [tileView addSubview:aButton];
        [lvlScroller addSubview:tileView]; 
    }
    //Set the total size for the scrollable content
    lvlScroller.contentSize = CGSizeMake(installedLevelPacks.count*110, 125); 
}

Я действительно что-то здесь упускаю, я делал это раньше, но не с ARC, поэтому я застрял на том, что это преступник.

Вывод NSZombieсостояния: сообщение Objective C было отправлено освобожденному объекту (зомби) по адресу: 0x6b8d530.

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Я не понял это полностью, но похоже, что бутоны не сохраняются по какой-то причине.Чтобы предотвратить такую ​​проблему, я использовал свойство класса NSMutableArray * my_buttons для удержания временных кнопок:

UIButton * aButton = [[UIButton alloc] init ...];... [my_buttons addObject: aButton];

Конечно, если будет только 1 кнопка, вы можете сделать ее свойством класса.В любом случае, избегайте использования его в качестве локальной переменной.Но опять же, это всего лишь обходной путь, и я действительно не знаю, как вы предполагаете «сохранить» локальную переменную в среде ARC.

1 голос
/ 02 ноября 2011

Какой объект является displayPacks методом? Этот объект сохраняется после возврата displayPacks? Имейте в виду, что элементы управления, такие как UIButton do not , сохраняют свои цели, поэтому вам нужно сделать что-то еще.

...