XCode 6.4优化版本上iOS ARC过度发布崩溃的原因?

XCode 6.4优化版本上iOS ARC过度发布崩溃的原因?,ios,objective-c,xcode,automatic-ref-counting,arm64,Ios,Objective C,Xcode,Automatic Ref Counting,Arm64,以下方法由于inputLower的早期ARC释放而崩溃,即使范围内仍然存在强大的ptr。这是使用XCode 6.4为ARM64构建的,只有在使用-Os优化时才会崩溃。这是ARC错误,还是我犯了某种ARC逻辑错误 void crasher(NSString * input) { NSString * inputLower = [input lowercaseString]; // should be strong ptr NSString * inputLower2 = input

以下方法由于inputLower的早期ARC释放而崩溃,即使范围内仍然存在强大的ptr。这是使用XCode 6.4为ARM64构建的,只有在使用-Os优化时才会崩溃。这是ARC错误,还是我犯了某种ARC逻辑错误

void crasher(NSString * input) {
    NSString * inputLower = [input lowercaseString]; // should be strong ptr
    NSString * inputLower2 = inputLower; // should be a 2nd, independent strong ptr        
    int i = 1;
    while (i < 10) {
        inputLower2 = [NSString stringWithFormat:@"%@%d", inputLower, i++];
        // ERROR: inputLower is released here, so the next iteration will crash
        NSLog(@"%@", inputLower2);
    }
}

如果这不是我的错,我会向苹果公司提交一个bug。

我以前见过这种情况。与其说它是一个ARC问题,不如说它是一个优化问题,尤其是NSLog。在本例中,是while循环中的NSLog导致了问题;有些东西正在被优化。如果将NSLog移动到while循环之后,您将看到该循环工作正常


此外,我无法在Xcode 7中重现崩溃(这就是为什么我花了这么长时间才重现它;我必须专门切换到Xcode 6.4)。这表明苹果人确实知道这一点。

“这是一个ARC错误,还是我犯了某种ARC逻辑错误?”。这与电弧无关。它与优化有关(正如您正确地建议的),也许还与绑定到Xcode的性质有关。尝试在设备上独立运行此应用程序-也就是说,不是从Xcode内部启动的,因此也不会绑定到Xcode。现在它崩溃了吗?是的,当不受约束且不进行调试时,它会崩溃,但只有在优化的构建运行时才会崩溃。如果未经调试运行未经优化的生成,则不会崩溃。事实上,是一份来自现场的事故报告提醒了我这个问题。在我看来,优化是建立与ARC规则冲突的指针别名假设。等一下,我无法重现崩溃。。。给我一点时间让它崩溃好吧,崩溃了!让我看看是否可以使用它。它是
while
循环中的NSLog;有些东西正在被优化。如果将NSLog移动到
while
循环之后,您将看到循环工作。
NSString * inputLower2 = [inputLower copy];