UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"alert" message:nil preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"action" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self doSomething];
}];
[alert addAction:action];
[self presentViewController:alert animated:YES completion:nil];
I understand the cycle. self
retains the UIAlertController
, UIAlertController
retains the UIAlertAction
, UIAlertAction
retains self
What I mean is internally couldn't this class have been designed to release everything after one of the UIAlertActions has been run?
-
To clarify, I know that this issue can be avoided by using a weak reference to self.
What I am asking is why doesn't UIAlertController
just nil out all the actions (and hence their handler blocks) once an action has been selected by the user. This would break the cycle and avoid the whole weakself dance we need to do.
Something like this...
@implementation UIAlertController
...
// An action button was pressed
- (void)actionSelectedIndex:(NSInteger)index
{
UIAlertAction *action = self.actions[index];
action.handler(action); // Run the action handler block
self.actions = nil; // Release all the actions
}