Я создаю подкласс UIView
:
BeneficialsFormView *view = [[BeneficialsFormView alloc] init];
view.alpha = 0;
view.delegate = self;
view.screenView = [self.delegate displayEntityForm:view];
Вызов делегата должен отображать UIView
и возвращает UIView, который я использую для отключения фоновых касаний (просто UIView с черным черным фоном и уменьшенной альфой).
В подклассе UIView
я добавляю уведомления клавиатуры:
-(void)awakeFromNib {
DLog(@"fired");
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardEvent:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardEvent:) name:UIKeyboardWillHideNotification object:nil];
// UI Code
}
Я пытаюсь удалить NSNotifications
в dealloc
:
-(void)dealloc {
DLog(@"fired");
[[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:UIKeyboardWillShowNotification];
[[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:UIKeyboardWillHideNotification];
}
Проблема в том, что dealloc
срабатывает сразу после awakeFromNib
:
2013-06-12 15:37:39.260 DEBUG | -[BeneficialsFormView init] | fired
2013-06-12 15:37:39.287 DEBUG | -[BeneficialsFormView awakeFromNib] | fired
2013-06-12 15:37:39.339 DEBUG | -[BeneficialsFormView dealloc] | fired
Все они срабатывают с разницей в 0,1 секунды. Подкласс UIView
ведет себя именно так, как я хочу; Он показывает, все его содержимое работает, и я могу removeFromSuperview
без проблем.
Я исходил из предположения, что dealloc
сработает, когда все ссылки на подкласс UIView
достигнут 0?
Я использую АРК.
Что я делаю неправильно?
РЕДАКТИРОВАТЬ:
Выяснил, что я делаю неправильно:
-(id)init {
DLog(@"fired");
DLog(@"self: %@",self);
self = [super init];
if (self) {
self = [[[NSBundle mainBundle] loadNibNamed:@"BeneficialsFormView" owner:self options:nil] objectAtIndex:0];
}
return self;
}
Поэтому я создаю свое представление с помощью метода init
, который загружает файл xib. awakeFromNib
срабатывает, а затем объект, который я создаю с помощью моего файла init
, теряет ссылку и освобождается, в то время как объект, созданный из awakeFromNib
, отображается.
Как я могу это исправить? Или я делаю что-то принципиально неправильное и создаю разрыв в пространственно-временном континууме?
2013-06-12 18:15:33.957 DEBUG | -[BeneficialsFormView init] | fired
2013-06-12 18:15:33.959 DEBUG | -[BeneficialsFormView init] | self: <BeneficialsFormView: 0x1f0b1d50; frame = (0 0; 0 0); transform = [0, 0, 0, 0, 0, 0]; alpha = 0; opaque = NO; layer = (null)>
2013-06-12 18:15:33.988 DEBUG | -[BeneficialsFormView awakeFromNib] | fired
2013-06-12 18:15:33.989 DEBUG | -[BeneficialsFormView awakeFromNib] | self: <BeneficialsFormView: 0x1e58da60; frame = (0 0; 350 400); autoresize = RM+BM; layer = <CALayer: 0x1e5c60f0>>
2013-06-12 18:15:34.044 DEBUG | -[BeneficialsFormView dealloc] | fired
2013-06-12 18:15:34.045 DEBUG | -[BeneficialsFormView dealloc] | self: <BeneficialsFormView: 0x1f0b1d50; frame = (0 0; 0 0); layer = <CALayer: 0x1f0d4830>>
displayEntityForm:
), добавляется представление: [mainView addSubview:benefentialsView]`. Не приведет ли это к собственности? - person Padin215   schedule 13.06.2013@property (strong, nonatomic) BeneficialsFormView *beneficialView;
и назначить ее, но проблема все еще есть. - person Padin215   schedule 13.06.2013BeneficialsFormView *view = [[BeneficialsFormView alloc] init];
, а затемself.beneficialView = view
. - person Padin215   schedule 13.06.2013displayEntityForm:view
добавляет представление. Вызов делегата передается через другой подклассUIView
вUIViewController
, который добавляет представление к его основному представлению. - person Padin215   schedule 13.06.2013