我遇到了一个问题,即我遇到了错误的访问异常,但仅在运行测试版本时(在调试版本中调用相同的方法不会导致问题出现)。该项目启用了 ARC,我正在使用 Xcode 4.3 在 iPad 5.1 模拟器上运行它:
这就是问题出现的地方:
- (void)testChangeFoodNotification {
Player* p = [[Player alloc] init];
[p addObserver:self forKeyPath:@"food" options:0 context:0]; // <-EXC_BAD_ACCESS (code=2)
p.food += 1;
STAssertTrue(_wasNotifiedOfFoodChange, nil);
}
在addObserver:
调用该方法时,似乎不应该释放任何涉及的对象,那么可能导致异常的原因是什么?
编辑:
抱歉,如果不清楚,但上面的代码正在作为测试用例的一部分执行(使用标准 Xcode OCUnit)。此外,如果它澄清了任何来自播放器类的相关代码(还有其他 ivars 和方法,但它们与正在测试的属性或方法没有任何联系):
// Public interface
@interface Player : NSObject
@property (nonatomic, assign) NSInteger food;
@end
// Private interface
@interface Player() {
NSInteger _food;
}
@end
@implementation Player
@synthesize food = _food;
#pragma mark - Getters/Setters
- (void)setFood:(NSInteger)food {
[self willChangeValueForKey:@"food"];
_food = food;
[self didChangeValueForKey:@"food"];
}