我有一个bug,我在自动释放功能中崩溃。经典:过度释放后访问对象。
问题是iOS程序正在使用EAAccessory,并且由于从设备接收数据而在某处发生。
因此,需要在模拟器之外诊断问题。由于NSZombie的内存要求,在模拟器外部禁用了iOS的NSZombie。
有什么建议/想法可以在模拟器之外的iOS世界中用NSZombie轻松追踪到过度发布的bug吗?
我已经考虑过尝试为模拟器保留EAAcessory的行为;但由于时间限制,由于所需的工作量,更多的是“下一次重构/增强”。
现在我只需要找到糟糕的访问错误。
发布于 2011-05-18 21:47:05
由于我没有使用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可以按类添加筛选器,以便仅为您怀疑的特定类运行调试代码。
https://stackoverflow.com/questions/6045602
复制相似问题