Отпустите вызов дважды с одним и тем же объектом NSNotificationCenter

Я хочу передать объект из представления A в представление B, это работает, но когда я повторяю этот метод, у меня происходит сбой (поток 1: EXC_BREAKPOINT).

Я инициализирую в своем представлении B как:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hotSpotMore:) name:@"HotSpotTouched" object:nil];
    }
    return self;
}


 - (void)hotSpotMore:(NSNotification *)notification {

        self.articleVC = [[ArticlesVC alloc] init];
        self.articleVC=[notification.userInfo objectForKey:@"Art"]; // ERROR LINE


    }

В моем представлении A как:

        NSDictionary *myDictionary=[NSDictionary dictionaryWithObject:articles forKey:@"Art"];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"HotSpotTouched" object:self userInfo:myDictionary];

Я восстанавливаю свой объект в переменной экземпляра, в первые два раза, это работа и после сбоя.

Вывод: ArticlesVC setArticleVC:]: сообщение отправлено на освобожденный экземпляр 0x44883f10

И в моем инструменте Zombie у меня есть эта ошибка: сообщение Objective-C было отправлено освобожденному объекту «ArticlesVC» (зомби) по адресу: 0xc2d0710. 

Моя проблема в том, что метод Dealloc вызывается дважды, и у меня есть зомби, потому что мой «RefCt» установлен на «-1», я не понимаю, почему этот метод вызывается дважды. Как я могу это решить?


person Pierre_S    schedule 14.02.2014    source источник


Ответы (2)


Ваш viewB уже освобожден, но viewA отправляет объект viewB, которого уже не существует. Добавьте removeObserver к dealloc:

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
person Valentin Shamardin    schedule 14.02.2014
comment
Я забыл поместить эту часть своего кода, я сделал это, и этот метод вызывается дважды, в этом моя проблема... Я не знаю, почему - person Pierre_S; 14.02.2014
comment
@Pierre_S, dealloc вызывается дважды? Сколько раз вызывается init? - person Valentin Shamardin; 14.02.2014
comment
Когда он работает, init и Dealloc вызываются один раз (первый раз), а когда он не работает, вызывается один init и два Dealloc (три раза). Между тем, когда это работает и не работает, есть два init и два Dealloc, возможно, проблема здесь. (Второй раз) - person Pierre_S; 14.02.2014

Ваш наблюдатель уведомлений будет добавляться каждый раз, когда вы вызываете initWithNibName для своего класса. Попробуйте удалить более ранний наблюдатель перед добавлением нового.

вы можете сделать это либо в

- (void)dealloc
{
     [[NSNotificationCenter defaultCenter] removeObserver:self];
}

or

- (void)viewdidUnload 
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
person Dinesh    schedule 14.02.2014
comment
viewdidUnload не вызывается всякий раз, и у меня такая же проблема - person Pierre_S; 14.02.2014