1

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

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

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

任何提示/想法如何在模拟器之外的 iOS 世界中使用 NSZombie 轻松追踪过度发布的错误?

我已经考虑过尝试为模拟器存根 EAAcessory 的行为;但由于时间限制,由于所需的工作量更多,更多的是“下一次 rev-refactor/enhancement”。

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

4

1 回答 1

1

由于我没有使用 EAAccessory 的经验,我不知道这是否可行,但这里有一个建议。从保留/释放调试(rentzsch.tumblr.com):

#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

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

于 2011-05-18T13:47:05.250 回答