不正なアクセスの例外が発生するという問題がありますが、テストビルドを実行している場合のみです(デバッグビルドで同じメソッドを呼び出しても問題は発生しません)。プロジェクトでARCが有効になっており、Xcode4.3を使用してiPad5.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を使用)。また、プレーヤークラスからの関連コードがここにあることが明らかになった場合(他のivarとメソッドがありますが、テストされているプロパティやメソッドとは関係ありません):
// 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"];
}