Сообщение Objective C было отправлено освобожденному объекту __NSDictionaryI (зомби) по адресу 0x1

У меня есть приложение, использующее Multipeer Connectivity для отправки строки с одного устройства iOS на другое устройство iOS. Это работает и не работает.

Приложение в значительной степени является приложением, которое можно увидеть в руководстве по этой ссылке: http://www.appcoda.com/intro-multipeer-connectivity-framework-ios-programming/

Иногда приложение отправляет около 30 сообщений, а затем вылетает, в других случаях происходит сбой при первом или втором сообщении.

XCode дает мне EXC_BAD_ACCESS для аварии.

Я использовал NSZombie, чтобы оказать некоторую помощь, и он предоставил мне следующее, но я довольно новичок и не могу понять причину аварий.

Скриншот NSZombie

Если произошел сбой из-за NSDictionary, в моем приложении только 2:

-(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state{
    NSDictionary *dict = @{@"peerID": peerID,
                           @"state" : [NSNumber numberWithInt:state]
                           };

    [[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidChangeStateNotification"
                                                        object:nil
                                                      userInfo:dict];
}


-(void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{
    NSDictionary *dict = @{@"data": data,
                           @"peerID": peerID
                           };

    [[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidReceiveDataNotification"
                                                        object:nil
                                                      userInfo:dict];
}

Какие-либо предложения?

1 ответ

Зомби обычно появляются, когда вы пытаетесь получить доступ к любому освобожденному объекту.

Если вы используете ARC, вам не нужно сильно беспокоиться о зомби, X-код делает это за вас, но есть некоторые случаи, когда зомби попадают в проект ARC. У меня никогда не было такого рода проблем.

Если вы используете не ARC-проект, вам нужно освободить объекты вручную.

Как следует из вашего сообщения об ошибке, вы использовали объект словаря, который еще не был выделен или освобожден, и вы пытаетесь использовать его снова.

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

Пожалуйста, обновите ваш код в соответствии с этим.

Надеюсь, это поможет вам.

Другие вопросы по тегам