我的项目中有手动引用计数。此外,还有很多多线程。有些属性不是线程安全的。:(
我对这次崩溃的原因只有一个假设:某些对象被过度释放(?)。
我添加了自动化 UI 测试 ( Appium
),但它们还没有帮助。
此外,我已经分析了Zombies
- 一切似乎都很好。
另外,我尝试过 Xcode 的静态分析器(Product -> Analyze
),有很多警告,但似乎都不是导致此类崩溃的原因(我已经查看了警告Incorrect decrement of reference count not owned at this point
)。
我用 MRC 创建了一个测试项目,并添加了这样的代码:
- (void)testAssumptions {
//@autoreleasepool
{
[self overReleaseNilValue];
[self overReleaseNotNilValue];
}
}
- (void)overReleaseNilValue {
NSIndexPath* path = [[NSIndexPath alloc] initWithIndex:42];
[path release];
[path release];
}
- (void)overReleaseNotNilValue {
NSIndexPath* path = nil;
[path release];
[path release];
}
在启用自动释放池或没有池的情况下,两次释放对象都不会崩溃。
所以我的问题是:
1.除了释放已经发布的对象之外,这种崩溃的另一个原因是什么?
2. 有没有办法增加重现此类崩溃的概率?例如一些环境。变量会降低一些自动释放池对不安全代码的容忍度?或者一些额外的自动释放池?
3. 为什么我的测试项目代码没有崩溃?
任何意见都受到高度赞赏。