2016-03-01 6 views
2

У меня есть сбои, возникающие при нажатии на UITextField. У меня есть два контроллера, скажем, A и B. Когда я показываю контроллер B модно в контроллере A и нажмите на UITextField, все в порядке. Затем я увольняю диспетчер B и представляю его снова. На этот раз, когда я нажимаю на ошибку UITextField. Когда я включил NSZombie в свою схему, появляется сообщение об аварии - -[UITextField textInputView]: message sent to deallocated instance.UITextField textInputView сообщение, отправленное на освобожденный экземпляр

У меня нет UITextFieldDelegate на UITextField. Когда я пытался отлаживать инструменты -> Zombies, нет исходного кода (недоступен), когда я дважды щелкаю строку релизов/сохранения истории.

0 0 Моя оценка Конфигурация здания is Отладка. Версия Xcode - 7.2.1. Сбои возникают только на iOS 8. iOS 9 в порядке.

PS: Когда я пытаюсь повторно symbolicate приложение, я вижу, что есть одна отсутствует система Каркасыdyld. Затем нажмите Найдите и откройте dsym файл моего отладочного приложения, но ошибка возникает с сообщением «Указанный путь не нашел dSYM для любой из выбранных библиотек».

ОБНОВЛЕНИЕ 1:

Контроллер:

#import <UIKit/UIKit.h> 

@interface A : UIViewController 
@end 

#import "A.h" 
#import "RoundedButton.h" 

@interface A() 
@property (weak, nonatomic) IBOutlet RoundedButton *signInButton; 
@end 

@implementation A 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self configUI]; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; 
    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
} 

- (UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleDefault; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Segue 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"signIn"]) { 

    } 
} 

#pragma mark - Config UI 

- (void)configUI { 
    // setup ui  
} 

- (void)dealloc { 
    NSLog(@"%@ deallocated", NSStringFromClass([self class])); 
} 

@end 

В Контроллер:

#import <UIKit/UIKit.h> 

@interface B : UIViewController 
@end 

#import "B.h" 
#import "SKFormTextField.h" 
#import "RoundedButton.h" 

@interface B() 
@property (weak, nonatomic) IBOutlet UITextField *textField; 
@property (weak, nonatomic) IBOutlet RoundedButton *signInButton; 
@end 

@implementation B { 
    SKAlertView *alertView; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self configUI]; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
} 

#pragma mark - Actions 

- (IBAction)cancelSignIn:(id)sender { 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

#pragma mark - Config UI 

- (void)configUI { 
    self.navigationController.navigationBarHidden = YES; 

    self.textField.secureTextEntry = true; 
    self.textField.autocorrectionType = UITextAutocorrectionTypeNo; 
} 

- (void)dealloc { 
    NSLog(@"%@ deallocated", NSStringFromClass([self class])); 
} 

@end 

ОБНОВЛЕНИЕ 2:

Когда я звоню UITextField, как self.textField.text = @"Hello, World!";, нет аварии. Только когда я панорамирую/прикасаюсь к UITextField или звоню [self.textField becomeFirstResponder];, он падает.

+0

Был ли у вас сильная ссылка на текстовое поле B? И вы пытались установить делегат текстового поля на нуль в dealloc B? – Lumialxk

+0

Создаете ли вы какие-либо соединения с вашим 'UITextField' в контроллере A? – sschale

+0

Нет, '@property (слабый, неатомный) IBOutlet UITextField * textField;' и никаких подключений с контроллером нет ** A ** –

ответ

1

Наконец-то я нашел причину своих аварий. У меня есть UITextField расширение под названием UITextField (AutoSuggestion), где я вызвал метод dealloc для удаления собственных наблюдателей.

Пример кода:

/* .h file */ 
#import <UIKit/UIKit.h> 
// some protocol 
@interface UITextField (AutoSuggestion) 
// some properties and methods 
@end 

/* .m file */ 
#import "UITextField+AutoSuggestion.h" 
#import <objc/runtime.h> 
@implementation UITextField (AutoSuggestion) 
- (void)observeTextFieldChanges { 
    self.layer.masksToBounds = NO; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(toggleAutoSuggestion:) name:UITextFieldTextDidChangeNotification object:self]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideAutoSuggestion) name:UITextFieldTextDidEndEditingNotification object:self]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(getKeyboardHeight:) 
               name:UIKeyboardDidShowNotification 
               object:nil]; 
} 

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidEndEditingNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil]; 
} 
// other methods 
@end 

После того, как я удалил dealloc метод аварии исчез. Поэтому я решил найти новый способ реализовать функцию автозапусков.

Интересно то, что я нигде не импортировал заголовочный файл в код, но произошли сбой.

+0

Удаление метода 'dealloc' работает, спасибо! – hstdt

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

  • Нет связанных вопросов^_^