首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS上的NSZombie不在模拟器中

iOS上的NSZombie不在模拟器中
EN

Stack Overflow用户
提问于 2011-05-18 21:35:23
回答 1查看 398关注 0票数 1

我有一个bug,我在自动释放功能中崩溃。经典:过度释放后访问对象。

问题是iOS程序正在使用EAAccessory,并且由于从设备接收数据而在某处发生。

因此,需要在模拟器之外诊断问题。由于NSZombie的内存要求,在模拟器外部禁用了iOS的NSZombie。

有什么建议/想法可以在模拟器之外的iOS世界中用NSZombie轻松追踪到过度发布的bug吗?

我已经考虑过尝试为模拟器保留EAAcessory的行为;但由于时间限制,由于所需的工作量,更多的是“下一次重构/增强”。

现在我只需要找到糟糕的访问错误。

EN

回答 1

Stack Overflow用户

发布于 2011-05-18 21:47:05

由于我没有使用EAAccessory的经验,我不知道这是否可行,但这里有一个建议。来自retain/release debugging (rentzsch.tumblr.com):

代码语言:javascript
复制
#if 1
- (id)retain {
    NSUInteger oldRetainCount = [super retainCount];
    id result = [super retain];
    NSUInteger newRetainCount = [super retainCount];
    printf("%s<%p> ++retainCount: %lu => %lu\n", [[self className] UTF8String], self, oldRetainCount, newRetainCount);
    printf("%s\n", [[[NSThread callStackSymbols] description] UTF8String]);
    return result;
}

- (void)release {
    NSUInteger oldRetainCount = [super retainCount];
    BOOL gonnaDealloc = oldRetainCount == 1;
    if (gonnaDealloc) {
        printf("%s<%p> --retainCount: 1 => 0 (gonna dealloc)\n", [[self className] UTF8String], self);
        printf("%s\n", [[[NSThread callStackSymbols] description] UTF8String]);
    }
    [super release];
    if (!gonnaDealloc) {
        NSUInteger newRetainCount = [super retainCount];
        printf("%s<%p> --retainCount: %lu => %lu\n", [[self className] UTF8String], self, oldRetainCount, newRetainCount);
        printf("%s\n", [[[NSThread callStackSymbols] description] UTF8String]);
    }
}
#endif

可以按类添加筛选器,以便仅为您怀疑的特定类运行调试代码。

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

https://stackoverflow.com/questions/6045602

复制
相关文章

相似问题

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