首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSZombies正在吃我的应用程序的大脑!

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

Stack Overflow用户
提问于 2009-07-29 08:21:21
回答 3查看 2.4K关注 0票数 6

我有留用/释放的问题。我的视图非常复杂,所以我将NSZombieEnabled设置为“是”,并试图定位哪个对象,确切地说,是哪个对象引起了我的悲伤。为了加快这一过程,我想知道是否有线索或技巧来追踪僵尸回到他们挖出来的坟墓(抱歉,不得不这么做),还是回到他们与之相关的对象上?神秘的控制台消息似乎没有提供太多的洞察力:

代码语言:javascript
复制
NSInvocation: warning: object 0x1076850 of class '_NSZombie_CALayer' does not implement methodSignatureForSelector: -- trouble ahead

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

编辑-包括堆栈跟踪:

代码语言:javascript
复制
#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中查找有问题的内存地址,我发现两个匹配:

代码语言:javascript
复制
#    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:

代码语言:javascript
复制
#   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:

代码语言:javascript
复制
#   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中更深的钻研揭示了完全相同的信息。我想这应该可以减少half...but中的故障排除--我仍然不知道.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-29 18:23:43

我相信回溯就是僵尸被传讯的地方。这个回溯通常给你零的信息,是什么导致了崩溃。它只告诉您被过度释放的对象的类型和地址。

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

票数 6
EN

Stack Overflow用户

发布于 2009-07-29 13:43:03

您可以快速做的一件事是在objc_exception_throw上设置一个符号断点。这将导致程序在抛出异常时暂停。这可能并不能帮助您准确地找到CALayer给您带来悲伤的原因,但它会帮助您找到调用它的大致位置。

票数 2
EN

Stack Overflow用户

发布于 2009-07-29 18:56:49

“前方的麻烦”是警告的一部分,而不是选择器。警告本身来自NSInvocation,但实际上它提到了“类_NSZombie_CALayer”,这意味着某些东西正在尝试使用已被释放的CALayer。

堆栈跟踪表明,当一个层试图释放其子层时,就会发生这种情况。

总之,这意味着正在发布的层有一个子层,该子层在代码中的某个地方已经被过度释放。检查您对CALayers的内存管理,或者尝试Clang静态分析仪

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1198745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档