Я решил проблему с помощью чего-то, что звучит странно: «Вызовы [self retain] и [self autorelease]».
Вот случай:
MyObject является подклассом UIView,поэтому обычно он выделяется, помещается в стек представления и освобождается.MyObject также имеет таймер, который удалит себя из суперпредставления.Таким образом, в основном MyObject может быть освобожден в любое время.Помимо отображения классных вещей, MyObject также может отображать UIAlertView и ожидает выбора пользователя, поэтому он является делегатом alertView.Проблема в том, что если пользователь делает выбор после освобождения MyObject ... ну, вы знаете EXC_BAD_ACCESS, я думаю ...
Так что я мог бы сохранить ссылку на AlertViews (да, есть несколько),и установите для делегата значение nil в методе Mylocity Deloc.Но тогда я не смог обработать выбор (а так как их несколько, это сделало бы больше переменных, которые мне не нравятся.
Итак, что я сделал:
//alertView creation
-(void)showAlert{
[self retain];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"title"
message:@"message"
delegate:self
cancelButtonTitle:@"No"
otherButtonTitles:@"Yes",nil];
[alertView show];
[alertView release];
}
//Delegate method
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
[self autorelease];
// Do the job
}
Я знаю, что это нехорошо, я написал много комментариев по этому поводу, чтобы другие разработчики, которые будут повторно использовать код, были осторожны, но я не вижу другого варианта. Это правильно? Есть ли лучший способ сделать это?