cocoa - NSZombies 正在吃我应用程序的大脑!

标签 cocoa cocoa-touch debugging retain

我遇到了保留/释放问题。我的 View 非常复杂,因此我将 NSZombieEnabled 设置为 YES,并试图准确地找到哪个对象引起了我的悲伤。为了加快这个过程,我想知道是否有提示或技巧可以追踪僵尸回到他们挖出的坟墓(抱歉,不得不),或者回到与他们相关的物体?神秘的控制台消息似乎没有提供太多见解:

NSInvocation: warning: object 0x1076850 of class '_NSZombie_CALayer' does not implement methodSignatureForSelector: -- trouble ahead

我没有称为“前方麻烦”的选择器。

编辑 - 包括堆栈跟踪:

#0  0x3026e017 in ___forwarding___
#1  0x3024a0a2 in __forwarding_prep_0___
#2  0x302042e8 in CFRelease
#3  0x00c4fc31 in CALayerUpdateSublayers
#4  0x00c4e173 in -[CALayer dealloc]
#5  0x00c4000e in CALayerRelease
#6  0x00c48dad in CALayerFreeTransaction
#7  0x00c410b8 in CA::Transaction::commit
#8  0x00c492e0 in CA::Transaction::observer_callback
#9  0x30245c32 in __CFRunLoopDoObservers
#10 0x3024503f in CFRunLoopRunSpecific
#11 0x30244628 in CFRunLoopRunInMode
#12 0x32044c31 in GSEventRunModal
#13 0x32044cf6 in GSEventRun
#14 0x309021ee in UIApplicationMain
#15 0x00001eb4 in main at main.m:14

编辑2:ObjectAlloc

在 ObjectAlloc 中查找有问题的内存地址,我发现两个匹配项:

#    Address     Category           Creation Time      Size Responsible Library Responsible Caller
0   0x1076980   GeneralBlock-48    00:11.470       48      QuartzCore  -[CALayer setDelegate:]
1   0x1076980   CALayer            00:11.552       48      UIKit       -[UIView _createLayerWithFrame:]

深入研究#0 GeneralBlock-48:

#   Category        Event Type  Timestamp   Address Size    Responsible Library Responsible Caller
0   GeneralBlock-48 Malloc      00:11.470   0x1076980   48  QuartzCore  -[CALayer setDelegate:]
1   GeneralBlock-48 Free        00:11.551   0x1076980   -48 QuartzCore  -[CALayer addAnimation:forKey:]
2   CALayer         Malloc      00:11.552   0x1076980   48  UIKit   -[UIView _createLayerWithFrame:]

深入研究#1 CALayer:

#   Category        Event Type  Timestamp   Address    Size Responsible Library Responsible Caller
0   GeneralBlock-48 Malloc      00:11.470   0x1076980   48  QuartzCore  -[CALayer setDelegate:]
1   GeneralBlock-48 Free        00:11.551   0x1076980   -48 QuartzCore  -[CALayer addAnimation:forKey:]
2   CALayer         Malloc      00:11.552   0x1076980   48  UIKit   -[UIView _createLayerWithFrame:]

好吧,我现在发现,在 #0 或 #1 中进行更深入的钻探会揭示完全相同的信息。我想这应该可以将故障排除减半...但我仍然不知所措...

最佳答案

我相信回溯只是向僵尸发送消息的点。此回溯通常为您提供有关导致崩溃的原因的零信息。它几乎只告诉您正在过度释放的对象的类型和地址。

我经常用来跟踪过度释放的一种技术是使用 Instruments 的 ObjectAlloc 来跟踪所有保留和释放。在ObjectAlloc中找到过度释放的对象的地址,然后列出所有的retain/release调用,然后尝试平衡每个retain和release。一旦您找到没有保留匹配的版本,您就发现了问题。

关于cocoa - NSZombies 正在吃我应用程序的大脑!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1198745/

相关文章:

objective-c - `NSTreeController` 's `排列对象` doesn' t响应`children`

cocoa - 如何向 NSTableView 添加文本

cocoa - 在 NSTableView 中显示图像

iphone - 如何获得self.frame X轴

ruby-on-rails - 在工头任职期间是否有可靠的工具来单步执行代码

windows - 如何检测 CLR 抛出的异常?

android - XML 检测 Debug模式

ios - 有什么方法可以保证代码始终在主线程上执行?

iphone - Cocoa touch——获取设备信息

iphone - 如何卸载xcode并安装另一个版本?