Метод освобождения не вызывается из-за блоков

#objective-c #memory-management #block #objective-c-blocks #dealloc

#objective-c #управление памятью #блок #objective-c-blocks #освобождение

Вопрос:

Я написал ниже код в функции нажатия кнопки.

 - (IBAction)btnPlusClicked:(id)sender forEvent:(UIEvent *)event {
    //show popover controller

    TSActionSheet* actionSheet = [[TSActionSheet alloc] initWithTitle:nil];

    [actionSheet addButtonWithTitle:@"Add New" block:^{
        //add new button clicked
        [self showAddNewView:0];
    }];

    [actionSheet addButtonWithTitle:@"Copy Yesterday" block:^{
        //Copy yesterday clicked
        [self showAddNewView:1];
    }];

    [actionSheet addButtonWithTitle:@"Copy from Date" block:^{
        //Copy from date clicked
        //show date picker
        [self showDatePicker];
    }];

    actionSheet.cornerRadius = 5;

    [actionSheet showWithTouch:event];
}
  

когда выполняется приведенный выше код -(void)dealloc , метод этого контроллера представления не срабатывает при приведенной ниже функции нажатия кнопки возврата внутри события.

 - (IBAction)btnBackClicked:(id)sender {
    [self.navigationController popViewControllerAnimated:animated];
}

-(void)dealloc
{
    NSLog(@"-->deallalloc in %@", [self class]);
} 
  

Обратите внимание, что приложение совместимо с ARC.

есть ли какое-либо решение?

Комментарии:

1. Вы создаете ссылочный цикл. Здесь есть множество потоков и множество документации на сайте Apple, как избежать ссылочных циклов. Сначала прочитайте документацию, чтобы понять разницу между слабой и сильной ссылкой.

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

3. Я также пытался использовать __weak и __block

4. __weak TSActionSheet* actSheet = ActionSheet; [actSheet addButtonWithTitle:@блок «Добавить новый»:^{ [self showAddNewView:0]; }]; [actSheet addButtonWithTitle:@блок «Копировать вчера»:^{ [self showAddNewView:1]; }];

5. @gnasher729, holex — я получил свою проблему, избегая сильных ссылочных циклов.

Ответ №1:

Чтобы избежать сильных циклов ссылок, нам нужно использовать слабую ссылку, как показано в приведенном ниже коде.

 - (IBAction)btnPlusClicked:(id)sender forEvent:(UIEvent *)event {

    if(actionSheet == nil)
    {
        MyViewController *__weak weakSelf = self;

        actionSheet = [[TSActionSheet alloc] initWithTitle:nil];

        [actionSheet addButtonWithTitle:@"Add New" block:^{
            [weakSelf showAddNewView:0];
        }];

        [actionSheet addButtonWithTitle:@"Copy Yesterday" block:^{
            [weakSelf showAddNewView:1];
        }];
        [actionSheet addButtonWithTitle:@"Copy from Date" block:^{
            [weakSelf showDatePicker];
        }];
        actionSheet.cornerRadius = 5;
    }
    [actionSheet showWithTouch:event];
  

}