第一次使用多线程,很多地方考虑不周,调试过程中遇到了种种问题,开始摸不到头绪,不知道问题在哪里;
今天终于把问题解决了,但是为什么会造成“给已释放的对象发送消息”还是没有弄明白,没看出那个对象它哪里被提前释放了,
是因为开启的多个线程中调用了同一个方法,而方法中的同一个全局变量在这些开启的不同线程中被使用造成的吗?
每次执行到方法
-(void)waitforHostIP
{
while (self.dealmessagesocket.hostIP==nil) {
if (self.multicastsocket.gethostIP!=nil) {
NSLog(@"%@",self.multicastsocket.gethostIP);
self.dealmessagesocket.hostIP=[self.multicastsocket.gethostIP copy];
}
}
}
中的
self.dealmessagesocket.hostIP=[self.multicastsocket.gethostIP copy];
就会报错;
self.multicastsocket.gethostIP为一个组播类中成员变量,当组播中获取到服务器ip的时候便把ip赋值给它;
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
NSString *message=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if(message)
{
NSString *ip=[[[NSString alloc] init] autorelease];
uint16_t port = 0;
[GCDAsyncUdpSocket getHost:&ip port:&port fromAddress:address];//这里如果我直接把ip换成self.gethostIP,也
//会报错,会在GCDAsyncUdpSocket 中的一个断言处停下来。
self.gethostIP=ip;
}[message release];
}
最后我选择的解决办法是调整了一下消息发送与处理的结构,只开启关于那个方法的一个线程,再调试,便解决了
警醒自己,多多摸索