“消息发送到解除分配的实例0xec75b0”,但0xec75b0甚至不应该可见

时间:2009-08-18 22:30:08

标签: objective-c

我正在开发一个iPhone应用程序,它与服务器进行一些通信,以便在第一次运行时进行初始化。我有一个ServerCommunication类,其中包含要执行的每个基本任务的方法(验证用户,获取激活密钥,下载更新等),并为每个任务创建一个新的ServerCommunication实例;我不会重复使用它们,虽然它会更有效率。

当用户完成第一个初始化屏幕时,ServerCommunication会被创建四次。我在其NSLog(@"Initializing ServerCommunication instance %p", self);方法中使用-init跟踪它。当用户点击“下一步”按钮时,第二个初始化屏幕也会调用ServerCommunication几次,但在最后一次实例化时,应用程序会在控制台中挂起消息-[ServerCommunication insertDataIntoLocalDB:]: message sent to deallocated instance 0xec75b0。问题是,0xec75b0是我在第一个屏幕上创建的ServerCommunication的第一个实例的地址。

为什么要向该实例发送消息?我不会把它们留在任何地方;他们大多是自动释放的。如果有帮助,该类中的所有方法都使用NSURLConnection执行XML数据的异步下载,然后使用NSXMLParser解析它。解析器的委托方法-(void)parserDidEndDocument:(NSXMLParser *)parser然后发送由我的视图控制器中的方法接收的NSNotifications,以便他们知道是继续进入下一个屏幕还是留在那里并显示错误消息。

非常感谢帮助!

1 个答案:

答案 0 :(得分:2)

我要做的第一件事就是打开NSZombies,它可以让你在你的僵尸被传递的地方打破。

此类问题的常见原因是,如果对象具有彼此弱引用但​​未同时分配和取消分配的对象。因此(假设),某些其他对象将指向ServerCommunication对象的指针存储为委托或所有者。取消分配ServerCommunication时,它不会取消注册,然后在一段时间内,持有弱引用的对象会尝试向您发送消息。

如果我必须完全猜测(而且我确实!)我打赌你将ServerCommunication对象添加为NSNotification观察者,但永远不要删除它们。请确保执行此操作:

 [[NSNotificationCenter defaultCenter] removeObserver:self];

在解除分配之前的某个时间。 (这里也可能存在涉及NSNotification的更迂回路径 - 例如指向ServerCommunication对象的指针作为数据传递给视图控制器,然后尝试向其发送消息。)