我收到此消息。问题是,我希望能够告诉cocoa如果对象不再存在则不发送通知。有没有办法做到这一点?
更广泛的图景:
我正在向服务器发送请求,但是当该请求正在进行时,用户可能已经做了一些事情来销毁期望请求的对象。当响应返回时,请求它的对象不再存在,所以我只想让通知中心不处理该消息。
现在,我在请求消息时保留对象,并在收到消息时释放它。这样,我就不会向解除分配的实例发送消息。但如果它永远不会得到响应,那么它可能不会被释放,从而导致内存泄漏。因此我的理由是尝试优雅地处理消息到解除分配的实例。
有什么想法吗?
答案 0 :(得分:3)
当您发送已解除分配的对象时,没有“优雅地失败”。
分配的对象由堆上分配的一些内存支持。它可能有许多参考该分配;许多指针包含所述分配的地址。当对象被释放时,除非明确重置为某个其他值,否则所有这些指针仍指向它。当然,一旦取消分配该位,就可以重新分配内存。
也就是说,不,没有魔法 - 无论如何都没有高效的魔法[见NSZombie] - 用于将所有指向特定对象的指针转换为神奇地吃掉所有消息而没有错误的东西。
换句话说,您需要构建您的应用程序,以便不再可行的对象在应用程序的所有层中实际上不再可行。
答案 1 :(得分:0)
正如bbum所说,你无法向解除分配的对象发送消息。它只是无效。甚至没有“解除分配的对象”这样的东西 - 一旦一个对象被解除分配,它就会消失。它不再是一件事,也不存在于任何地方。它的旧位模式可能会保留,或者一个不相关的对象可能会放在它的位置,或者是绝对的垃圾 - 这就是崩溃的来源,而不是一些神奇的“解除分配的对象”处理程序。
如果您不希望再发送对象通知,那么正确的做法就是取消注册接收它们。
答案 2 :(得分:-1)
如果对象不再存在,并且您不希望它在向垃圾邮件发送消息时崩溃(也就是说,如果您有一个指向已解除分配对象的指针并且您向该指针发送消息,则会导致严重崩溃),如果你想避免这种情况,请在nil
之后将指针设置为release
。这表示您已完成该对象。向nil
发送消息是完全可以接受的,但是发送消息到指向垃圾消息不是。
[iVar release];
iVar = nil; // done with this reference.