7

不正なアクセスの例外が発生するという問題がありますが、テストビルドを実行している場合のみです(デバッグビルドで同じメソッドを呼び出しても問題は発生しません)。プロジェクトで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"];    
}
4

2 に答える 2

21

クラスが実際にKey-Valueに準拠している場合は、問題を示しているクラスの実装がテスト製品に含まれていないことを確認してください。つまり、.mファイルのIDインスペクターのターゲットメンバーシップパネルでは、アプリのみをチェックする必要があります(YourAppTestsはチェックしないでください)。

Xcode 4.3.1で同じ問題が発生したのは、実装が両方の製品に含まれていて、本番コードとテストコードの両方にオブ​​ザーバーを登録したときです。次のログは私をひっくり返しました:

クラスYourClassは、/ Users / yourUser / Library / Application Support / iPhone Simulator / 5.1 / Applications // YourApp.app/YourAppと/Users/yourUser/Library/Developer/Xcode/DerivedData/YourApp-/Build/Products/の両方に実装されています。デバッグ-iphonesimulator/YourAppTests.octest/YourAppTests。2つのうちの1つが使用されます。どちらが未定義です。

于 2012-04-26T16:47:28.240 に答える
0

Key-Value Observingプログラミングガイドによると、PlayerはKey-Valueに準拠していますか?KVCコンプライアンスを確保していることを確認する必要があります。また、あなたもあなたのobserveValueForKeyPath:ofObject:change:context:?これらすべてを実行してもまだ機能していないと思われる場合は、コードを共有できます。

また、些細なことですが、これは問題を強調するためのコードスニペットだと思います。ARCがtestChangeFoodNotificationの最後にpオブジェクトを解放するため、最初にオブザーバーを削除したいと思ったので、これについてのみ説明します。

于 2012-04-20T13:31:12.013 に答える