我的Flood填充方法因访问错误而崩溃,我无法找到错误的任何想法吗?
当我启动我的应用程序时,我可以很好地绘制小物体但是当我想像油漆桶一样使用洪水填充用油漆填充更大的物体时它只会因BAD ACCESS错误而崩溃。
我是一个菜鸟,我尝试了很多东西,递归次数上升但仍然崩溃。 我在这个应用程序中使用ARC。
-(void)paintingBucket:(int)point point2:(int)point2 width:(int)width colorAtPoint:(UIColor *)color {
int offset = 0;
int x = point;
int y = point2;
if (point<1025 && point2<705) {
offset = 4*((width*round(y))+round(x));
int alpha = data[offset];
int red = data[offset + 1];
int green = data[offset + 2];
int blue = data[offset + 3];
color1 = [UIColor colorWithRed:(green/255.0f) green:(red/255.0f) blue:(alpha/255.0f) alpha:(blue/255.0f)];
if ([color1 isEqual: color] ) {
color3 = self.currentColor ;
CGFloat r,g,b,a;
[color3 getRed:&r green:&g blue: &b alpha: &a];
int reda = (int)(255.0 * r);
int greena = (int)(255.0 * g);
int bluea = (int)(255.0 * b);
int alphaa = (int)(255.0 * a);
// NSLog(@" red: %u green: %u blue: %u alpha: %u", reda, greena, bluea, alphaa);
data[offset + 3] = alphaa;
data[offset + 2] = reda;
data[offset + 1] = greena;
data[offset] = bluea;
[self paintingBucket:x+1 point2:y width:width colorAtPoint:color];
[self paintingBucket:x point2:y+1 width:width colorAtPoint:color];
[self paintingBucket:x-1 point2:y width:width colorAtPoint:color];
[self paintingBucket:x point2:y-1 width:width colorAtPoint:color];
}
}
}
修改 只有崩溃时才能获得的信息是&#34; 0x995d7d5f:calll 0x995d7d64; szone_malloc_should_clear + 14&#34;
我知道存在一些内存问题,但我无法识别它我解决它。 正如我说的那样,对于目标c来说,任何帮助都会很棒。
答案 0 :(得分:2)
几乎可以肯定是堆栈溢出。当您以递归方式填充区域时,堆栈中的项目数等于前端的长度,对于较大的区域,这可能会很长。
您应该使用基于队列的方法替换递归方法来解决此问题。
答案 1 :(得分:0)
你有
int x = point;
int y = point2;
if (point<1025 && point2<705)
{
...
但是你要从x和y中减去而不检查它们是否是&gt; 0
[self paintingBucket:x-1 point2:y width:width colorAtPoint:color];
[self paintingBucket:x point2:y-1 width:width colorAtPoint:color];
这可能是溢出的原因,因为递归不会因负值而停止。