iOS上的NSZombie不在模拟器中

iOS上的NSZombie不在模拟器中,ios,memory-management,ios-simulator,instruments,nszombie,Ios,Memory Management,Ios Simulator,Instruments,Nszombie,我有一个错误,自动释放功能崩溃了。经典:过度释放后访问对象 问题是,iOS程序正在使用EAP附件,并且由于从设备接收数据而在某处发生 因此,需要在模拟器外诊断问题。由于NSZombie的内存需求,NSZombie在模拟器外部的iOS中被禁用 在模拟器之外的iOS世界中,如何追踪NSZombie容易发现的过度发布错误,有什么提示/想法吗 我已经考虑过尝试在模拟器上删除eAccessory的行为;但由于时间的限制,由于所需的工作量,更多的是“下一次版本重构/增强” 现在我只需要找到坏的访问错误。因为

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

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

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

在模拟器之外的iOS世界中,如何追踪NSZombie容易发现的过度发布错误,有什么提示/想法吗

我已经考虑过尝试在模拟器上删除eAccessory的行为;但由于时间的限制,由于所需的工作量,更多的是“下一次版本重构/增强”


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

因为我没有EAAccessory的经验,我不知道这是否可行,但这里有一个建议。来自(rentzsch.tumblr.com):

#如果1
-(id)保留{
NSU整数oldRetainCount=[super retainCount];
id结果=[super retain];
NSU整数newRetainCount=[super retainCount];
printf(“%s++重新计数:%lu=>%lu\n”,[[self className]UTF8String],self,oldRetainCount,newRetainCount);
printf(“%s\n”,[[[NSThread callStackSymbols]description]UTF8String]);
返回结果;
}
-(无效)释放{
NSU整数oldRetainCount=[super retainCount];
BOOL gonnaDealloc=oldRetainCount==1;
如果(gonnaDealloc){
printf(“%s--retainCount:1=>0(即将解除锁定)\n”,[[self className]UTF8String],self);
printf(“%s\n”,[[[NSThread callStackSymbols]description]UTF8String]);
}
[超级发布];
如果(!gonnaDealloc){
NSU整数newRetainCount=[super retainCount];
printf(“%s--retainCount:%lu=>%lu\n”,[[self className]UTF8String],self,oldRetainCount,newRetainCount);
printf(“%s\n”,[[[NSThread callStackSymbols]description]UTF8String]);
}
}
#恩迪夫

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

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

#如果1
-(id)保留{
NSU整数oldRetainCount=[super retainCount];
id结果=[super retain];
NSU整数newRetainCount=[super retainCount];
printf(“%s++重新计数:%lu=>%lu\n”,[[self className]UTF8String],self,oldRetainCount,newRetainCount);
printf(“%s\n”,[[[NSThread callStackSymbols]description]UTF8String]);
返回结果;
}
-(无效)释放{
NSU整数oldRetainCount=[super retainCount];
BOOL gonnaDealloc=oldRetainCount==1;
如果(gonnaDealloc){
printf(“%s--retainCount:1=>0(即将解除锁定)\n”,[[self className]UTF8String],self);
printf(“%s\n”,[[[NSThread callStackSymbols]description]UTF8String]);
}
[超级发布];
如果(!gonnaDealloc){
NSU整数newRetainCount=[super retainCount];
printf(“%s--retainCount:%lu=>%lu\n”,[[self className]UTF8String],self,oldRetainCount,newRetainCount);
printf(“%s\n”,[[[NSThread callStackSymbols]description]UTF8String]);
}
}
#恩迪夫

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

这是一个好主意(我已经使用过它),但在这种情况下,我们将处理大约100个不同的类,并且可能过度发布OS类(如字典或数组),因此,我们不必为OS类插入代码。(该死,我错过了姿势)你可以在大多数Objective-C层次结构中插入这些方法,用一个类别扩展NSObject。它将产生一堆圆木,tho.:PIt是一个很好的开始(我也使用过它),但在这种情况下,我们要处理大约100个不同的类,并且我们可能会过度发布一个OS类(比如字典或数组),所以我们不一定要为OS类插入代码。(该死,我错过了姿势)你可以在大多数Objective-C层次结构中插入这些方法,用一个类别扩展NSObject。它将产生一堆圆木,tho.:P
#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