我正在处理RemoteIO以获取麦克风输入并将其修改得很少。有时会崩溃EXC_BAD_ACCESS没有消息(set NSZombieEnabled)
有时它会崩溃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 {..}
如果我= 0呢? i-1 <0,你会尝试访问Array超出范围的对象。和邮政编码有关的权力阵列。在哪里分配它,你在哪里释放它。 – 0x8badf00d 2012-02-03 04:45:48
您使用ARC吗? – whitelionV 2012-02-03 04:46:04
@whitelionV你的意思是“自动引用计数”?不,我不使用它!它是什么? – 2012-02-03 05:29:05