我正在处理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];
我发布的powers数据是..
- (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)答案 0 :(得分:0)
如果NSZombies解决了您的问题,则表示您的NSMutableArray
正在某处释放,或者它位于自动释放池中。你也可能试图在数组的边界外写字。
NSMutableArray
位于自动发布池中(它是通过便捷方法创建的,或者您是明确autorelease
d),请手动retain
它和release
当您不再需要它。release
。 if( i <= 0 || i >= [powers count] ) NSLog(@"Here's the problem. i = %d", i);
答案 1 :(得分:0)
我找到了答案。
发生了崩溃,因为NSMutableArray的反对 - 有时候会出错。
当我尝试用它每隔几毫秒做一些事情时。
所以我将Objective-C数组更改为C数组,如
int power[ARRAYSIZE];
在我更改之后,它运行正常。
可能是NSMutableArray并不是那么快就能做点什么。