Сообщение Objective C было отправлено освобожденному объекту __NSDictionaryI (зомби) по адресу 0x1
У меня есть приложение, использующее Multipeer Connectivity для отправки строки с одного устройства iOS на другое устройство iOS. Это работает и не работает.
Приложение в значительной степени является приложением, которое можно увидеть в руководстве по этой ссылке: http://www.appcoda.com/intro-multipeer-connectivity-framework-ios-programming/
Иногда приложение отправляет около 30 сообщений, а затем вылетает, в других случаях происходит сбой при первом или втором сообщении.
XCode дает мне EXC_BAD_ACCESS для аварии.
Я использовал 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-проект, вам нужно освободить объекты вручную.
Как следует из вашего сообщения об ошибке, вы использовали объект словаря, который еще не был выделен или освобожден, и вы пытаетесь использовать его снова.
Если вы хотите увидеть, где находится зомби, пожалуйста, нажмите на стрелку, которая отображается после сообщения в тревоге. Вы будете перенаправлены на линию, которая вызвала вашего зомби.
Пожалуйста, обновите ваш код в соответствии с этим.
Надеюсь, это поможет вам.