EXC_BAD_ACCESS 发布中的简单代码
EXC_BAD_ACCESS in simple code in release
下面这个简单的代码在调试中有效,但在 iPhone 6 上发布时失败。
XCode6.2 (6C131e)
调用 runTest 导致在最新的 64 位 iPhone 上出现 EXC_BAD_ACCESS。并且仅当构建优化级别设置为 'Faster' 或更高时才会发生:-O2、-O3、-Os 或 -Ofast。所以通常在 Release 配置中。
顺便说一句,当优化级别设置 'None' 或 'Fast' 时代码运行良好:-O0 或 -O1.
#import <objc/NSObject.h>
@interface Foo : NSObject
@end
@interface Test : NSObject {
Foo *field;
}
@end
@implementation Foo
- (Foo *)bar {
return self;
}
@end
@implementation Test
- (void)runTest {
Foo *foo = [[Foo alloc] init];
field = foo;
field = nil;
[foo bar];
}
@end
请解释为什么会这样。
我向 Apple Bug Reporter 发布了问题,但 Apple 曾要求提供更多详细信息,但之后再也没有回复。现在问题报告已经完全消失了。
顺便说一下,这似乎适用于 7.3 版的 clang。
下面这个简单的代码在调试中有效,但在 iPhone 6 上发布时失败。
XCode6.2 (6C131e)
调用 runTest 导致在最新的 64 位 iPhone 上出现 EXC_BAD_ACCESS。并且仅当构建优化级别设置为 'Faster' 或更高时才会发生:-O2、-O3、-Os 或 -Ofast。所以通常在 Release 配置中。 顺便说一句,当优化级别设置 'None' 或 'Fast' 时代码运行良好:-O0 或 -O1.
#import <objc/NSObject.h>
@interface Foo : NSObject
@end
@interface Test : NSObject {
Foo *field;
}
@end
@implementation Foo
- (Foo *)bar {
return self;
}
@end
@implementation Test
- (void)runTest {
Foo *foo = [[Foo alloc] init];
field = foo;
field = nil;
[foo bar];
}
@end
请解释为什么会这样。
我向 Apple Bug Reporter 发布了问题,但 Apple 曾要求提供更多详细信息,但之后再也没有回复。现在问题报告已经完全消失了。
顺便说一下,这似乎适用于 7.3 版的 clang。