2016-02-19 2 views
1

Попытка загрузить вид контроллера представления во время его deallocating не допускается и может привести к непредсказуемому поведениюПопытка загрузить вид контроллера представления в то время как это deallocating не допускается и может привести к непредсказуемому поведению

Это предупреждение появляется только один раз. Я Alloc на UIAlertView в базе:

viewController's viewDidLoad`self.alertView = [[UIAlertView alloc] initWithTitle.....`, 

и

`- (void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 
    self.alertView = nil; 
}` 

ViewController А и Б ViewController наследуют от основания ViewController.

Когда этот viewController A нажимает на viewController B, появляется предупреждение, но B pop to A и A снова нажимают на B, это предупреждение не появляется.

Когда я использую симулятор (iOS 9.2), появляется предупреждение, но когда я использую iPhone (iOS 8.2), он не появляется.

ответ

2

Не Alloc INIT в alertView в viewDidLoad, Alloc alertView, когда вы используете его;

0

В ARC не нужно деалокотировать свойства. Если у вас есть определенные потребности, сделайте это в viewWillDisappear.

+0

Лучшее место для очистки освобождения - это (void) метод dealloc(), который вызывается автоматически, когда объект освобождается. Когда вид исчез, это не значит, что он освобожден. Например, вид может исчезнуть в режиме push segue, но он все равно будет существовать как объект. –

+0

@AlexeyLobanov Я сказал «особые потребности», dealloc не будет звонить, когда вы нажимаете новый контроллер представления. – Lumialxk

+0

yes view (not view but viewController и view as it is property) не будет освобожден при нажатии, потому что пользовательский интерфейс должен иметь представление, чтобы вернуться назад при перемотке;) Но в некоторых случаях может потребоваться очистка на ARC dealloc и гарантия место, чтобы сделать это - (void) dealloc() –

0

Если я правильно понимаю, вы определяете оповещение в базовом классе и должны показывать его только в A: Base, но не в B: Base. если так вот код:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:(BOOL)animated]; 
    if ([self isKindOfClass[A class]]) { 
     [self presentViewController:self.alert animated:YES completion:nil]; 
    } 
} 
+0

это alertView только для отображения информации об ошибке. Например, необходимо отобразить сетевую ошибку, и я не хочу, чтобы дисплей alertView, когда A нажал B. И если я удалю self.alterview = nil; предупреждение такое же, как и раньше. – liuqing

+0

1) Проверьте, какой класс сейчас является текущим A или B: if ([self isKindOfClass [A class]]) в дополнение к вашим другим условиям ошибки перед отображением предупреждения или что вы не находитесь в B, если (! [Self isKindOfClass [ B class]]) 2) не удалять предупреждение, назначая его нулю в viewDidDisappear –

Смежные вопросы

 Смежные вопросы