Tengo un problema donde recibo excepciones de acceso incorrecto pero solo cuando ejecuto una compilación de prueba (llamar a los mismos métodos en una compilación de depuración no hace que surja el problema). El proyecto ha permitido ARC y me estoy quedando esto en el simulador de iPad 5,1 usando Xcode 4.3:EXC_BAD_ACCESS utilizando ARC solo durante las pruebas
Aquí es donde el problema surge:
- (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);
}
En el punto cuando se llama al método addObserver:
que doesn' Parece que cualquiera de los objetos involucrados debería haber sido lanzado, entonces ¿qué podría estar causando la excepción?
EDIT:
Disculpas si no estaba claro, pero el código de seguridad se ejecuta como parte de un caso de prueba (utilizando el estándar Xcode OCUnit). También en caso de que aclara nada aquí está el código correspondiente de la clase de jugador (hay otros Ivars y métodos, pero que no tienen ninguna conexión con la propiedad o los métodos que se está probando):
// 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"];
}
Ojalá pudiera votar esto 100 veces. ¡Gracias! – DexterW
También encontré este problema con CocoaPods. El archivo de implementación de la clase se incluyó en los pods para la aplicación y el objetivo de la prueba de la aplicación, excepto que no había una advertencia de clase duplicada en los registros. – Eric