即使在范围上仍然有很强的ptr,以下方法也会由于ARC的inputLower的早期发行而崩溃。这是使用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);
    }
}

只需添加一个副本即可避免崩溃,但是我已经详细阅读了ARC规则,而且我认为这不是必需的:
NSString * inputLower2 = [inputLower copy];

如果这不是我的错,我将向Apple提交错误。

最佳答案

我以前看过这种事情。它不是ARC而是优化问题,尤其是NSLog引起了它。在这种情况下,正是while循环内的NSLog导致了问题。某些东西正在被优化。如果将NSLog移至while循环之后,则会看到该循环有效。

而且,我无法在Xcode 7中重现崩溃(这就是为什么我花了这么长时间才能重现它;我不得不专门切换到Xcode 6.4)。这表明苹果人确实对此有所了解。

08-16 05:55