ios – 仅在测试期间使用ARC的EXC_BAD_ACCESS

前端之家收集整理的这篇文章主要介绍了ios – 仅在测试期间使用ARC的EXC_BAD_ACCESS前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个问题,我得到了错误的访问异常,但只有在运行测试版本时(在调试版本中调用相同的方法不会导致问题出现).该项目启用了ARC,我使用 Xcode 4.3在iPad 5.1模拟器上运行它:

这就是问题出现的地方:

  1. - (void)testChangeFoodNotification {
  2. Player* p = [[Player alloc] init];
  3. [p addObserver:self forKeyPath:@"food" options:0 context:0]; // <-EXC_BAD_ACCESS (code=2)
  4. p.food += 1;
  5. STAssertTrue(_wasNotifiedOfFoodChange,nil);
  6. }

调用addObserver:方法时,似乎不应该释放任何涉及的对象,那么可能导致异常的原因是什么?

编辑:

如果不清楚但上面的代码是作为测试用例的一部分执行(使用标准的Xcode OCUnit),则道歉.此外,如果它澄清了任何东西,这里是播放器类的相关代码(还有其他的ivars和方法,但它们没有任何连接到被测试的属性方法):

  1. // Public interface
  2. @interface Player : NSObject
  3.  
  4. @property (nonatomic,assign) NSInteger food;
  5.  
  6. @end
  7.  
  8. // Private interface
  9. @interface Player() {
  10. NSInteger _food;
  11. }
  12.  
  13. @end
  14.  
  15. @implementation Player
  16.  
  17. @synthesize food = _food;
  18.  
  19. #pragma mark - Getters/Setters
  20.  
  21. - (void)setFood:(NSInteger)food {
  22. [self willChangeValueForKey:@"food"];
  23. _food = food;
  24. [self didChangeValueForKey:@"food"];
  25. }

解决方法

如果您的课程确实符合键值,请确保展示该问题的课程的实施不包含在您的测试产品中.这意味着.m文件的Identity检查器的Target Membership面板应仅检查您的应用程序(而不是YourAppTests).

我在Xcode 4.3.1中遇到了同样的问题,当两个产品都包含一个实现时,我在生产和测试代码中都注册了观察者.以下日志告诉我:

Class YourClass is implemented in both /Users/yourUser/Library/Application Support/iPhone Simulator/5.1/Applications//YourApp.app/YourApp and /Users/yourUser/Library/Developer/Xcode/DerivedData/YourApp-/Build/Products/Debug-iphonesimulator/YourAppTests.octest/YourAppTests. One of the two will be used. Which one is undefined.

猜你在找的iOS相关文章