【发布时间】:2020-02-24 02:51:48
【问题描述】:
我的项目中有手动引用计数。此外,还有很多多线程。
有些属性不是线程安全的。 :(
我对这次崩溃的原因只有一个假设:某些对象被过度释放(?)。
我添加了自动化 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. 为什么我的测试项目代码没有崩溃?
任何cmets都非常感谢。
【问题讨论】:
标签: ios objective-c core-foundation nsautoreleasepool manual-retain-release