除了这个问题:NSRunLoop 正在接收一个奇怪的选择器;可能的比赛条件愚蠢?- 在发现 UIGestureRecognizer 正在被释放并收到一条消息的地方,我打印了我的一个 GR 的地址,以查看它是否是僵尸报告的那个。
使用代码中的打印消息,我不能再导致我最初寻找的崩溃。删除打印消息,看来我可以再次导致它。
由于我们正在处理释放/保留/释放问题,任何人都可以告诉我是否有可能打印出这个对象导致它被引用,从而避免它被释放?如果是这样,这告诉我我原来的问题是什么?发布的太多了?发布太早?
除了这个问题:NSRunLoop 正在接收一个奇怪的选择器;可能的比赛条件愚蠢?- 在发现 UIGestureRecognizer 正在被释放并收到一条消息的地方,我打印了我的一个 GR 的地址,以查看它是否是僵尸报告的那个。
使用代码中的打印消息,我不能再导致我最初寻找的崩溃。删除打印消息,看来我可以再次导致它。
由于我们正在处理释放/保留/释放问题,任何人都可以告诉我是否有可能打印出这个对象导致它被引用,从而避免它被释放?如果是这样,这告诉我我原来的问题是什么?发布的太多了?发布太早?
如果调用NSLog
来自后台线程,那么这很可能会改变事件的顺序。NSLog
以某种方式同步对 stderr 的写入——我不确定具体如何,但认为一个后果可能是对象生命周期的改变并不牵强。
至于这告诉您原始问题的内容,听起来它证实了 Dave DeLong 的诊断:您正在尝试使用过时的指针。这反过来意味着进行调用的代码位没有适当地保留,或者其他一些位过度释放。
在 10 年的 Mac 和 iOS 开发中,我从来没有想过 NSLog 对引用计数做了什么坏事。这就是我可以肯定的说。