#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];
}