我正在处理 RemoteIO 以获取麦克风输入并对其进行少量修改。
有时它会崩溃EXC_BAD_ACCESS
并且没有更多消息。
导致崩溃的行是这些;
int currPower = [[powers objectAtIndex:i] intValue];
int prevPower = [[powers objectAtIndex:i - 1] intValue];
解释代码,
- “权力”是
NSMutableArray
。 [powers count]
总是大于变量“i”
挣扎了一会儿,我找到了一个很好的方法来解决它。
一个环境变量。
所以我设置了NSZombieEnabled
,也NSDebugEnabled
让我可以看到崩溃的原因。
但即使我设置了变量,Xcode 也没有显示任何消息。(但当其他线路发生崩溃时,它会正确显示消息。)
还有一个奇怪的事情是它不会在运行开始后立即崩溃;它平均在一分钟内崩溃。(但时代真的不同。)
这是一个小小的猜测。当我将速率降低到比以前的一半时,它更加稳定。
那么,是否有问题NSMutableArray
,因为NSMutableArray
方法无法赶上速度?
还是您看到其他可能的原因?
==================================================== ========================================
还有一些代码。我是这样分配权力的。。
powers = [[NSMutableArray alloc] initWithCapacity:POWER_ARRAY_SIZE];
我释放权力阵列的地方是..
- (void)dealloc {
[powers release];
[super dealloc];
}
没有别的地方。
更详细的代码是这样的。
- (void)drawRect:(CGRect)rect
{
...//Do Something
...//Check "endindex" and "startindex" not to exceed boundary
for (int i = endindex; i > startindex; i-=1)
{
int currPower = [[powers objectAtIndex:i] intValue];
int prevPower = [[powers objectAtIndex:i - 1] intValue];
...//Doing something
}
}
此 drawRect: 方法每毫秒从主线程(按计时器)调用。
-- 在这个方法中更新(更具体地说是添加)权力
- (void)setPower:(int)p
{
[powers addObject:[NSNumber numberWithInt:p]];
while ([powers count] > POWER_ARRAY_SIZE){
[powers removeObjectAtIndex:0];
}
}
而且这个方法每毫秒调用一次。这是在后台线程中调用。
所以没有@autoreleasepool XCode 显示泄漏警报消息
出于这个原因,我用 @autoreleasepool{..} 阻止了方法(setPower)