【问题标题】:NSZombie on iOS not in the simulatoriOS 上的 NSZombie 不在模拟器中
【发布时间】:2011-08-28 02:02:58
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: ios memory-management ios-simulator instruments nszombie


    【解决方案1】:

    由于我没有使用 EAAccessory 的经验,我不知道这是否可行,但这里有一个建议。来自retain/release debugging (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
    

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

    【讨论】:

    • 这是一个开始的好主意(我已经使用过),但在这种情况下,我们正在处理大约 100 个不同的类,我们可能会过度发布一个 OS 类(比如字典或数组),因此我们不必将代码放入 OS 类中。 (该死的我想念姿势)
    • 您可以将这些方法插入到大多数使用类别扩展 NSObject 的 Objective-C 层次结构中。它会产生大量的日志。 :P
    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2014-12-26
    • 2014-09-27
    • 2018-08-17
    • 2016-04-04
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多