1

我需要实现一个递归函数来将一个图像拆分为多个小图像以进行益智游戏。

编辑:这是ShapeObject的类init方法的样子(目前只支持圆)//ShapeObject的init方法

//shape currently has only a property named radius (it's a circle)
- (id)initWithShape:(Shape*)shape rotation:(float)rotation position:(CGPoint)position
{
    self = [super init];
    if (self) {
        _position=position;
        _shape=shape;
        _rotation=MAX(0, MIN(rotation, 360));
        _color=nil;
        _shapePath=CGPathCreateMutable();


        CGPathAddArc(_shapePath, NULL, _position.x, _position.y, _shape.radius, 2*M_PI, 0, YES);
        CGPathCloseSubpath(_shapePath);
    }
    return self;
}

// in the processing class


-(void)recursiveTest:(ShapeObject*)shapeObject{
    if (!CGRectIntersectsRect(CGPathGetBoundingBox(shapeObject.shapePath), contextRect)) {
        return;
    }
    for (ShapeObject *obj in shapeObjects) {
        if (ccpFuzzyEqual(obj.position, shapeObject.position, 5)) {
            //break;
            return; //just return
        }
    }
    [shapeObjects addObject:shapeObjects]; //in front of method calls
    [self recursiveTest:[[ShapeObject alloc]initWithShape:shapeObject.shape rotation:0 position:findPoint(shapeObject.position, 300, shapeObject.shape.radius*2)]];
    [self recursiveTest:[[ShapeObject alloc]initWithShape:shapeObject.shape rotation:0 position:findPoint(shapeObject.position, 240, shapeObject.shape.radius*2)]];
    [self recursiveTest:[[ShapeObject alloc]initWithShape:shapeObject.shape rotation:0 position:findPoint(shapeObject.position, 60, shapeObject.shape.radius*2)]];
    [self recursiveTest:[[ShapeObject alloc]initWithShape:shapeObject.shape rotation:0 position:findPoint(shapeObject.position, 120, shapeObject.shape.radius*2)]];
    [shapeObjects addObject:shapeObjects];

}

堆栈跟踪: 在此处输入图像描述

按照我的逻辑,它应该像这样工作:检查它是否超出范围以及它是否已经添加到数组中。如果不是,则调用邻居,直到所有形状对象都在数组中并且遍历整个图片。

我在后台线程中执行所有这些操作,但是一旦我启动该函数,我就会得到 EXC_BAD_ACCESS 代码 2。

环顾四周后,我发现代码 2 与指针有关。

显然问题发生在我在内部创建路径的地方,但我不明白为什么应该这样做,因为那里没有指针,只有一个简单的 CreateMutablePath,从形状、位置和旋转创建实际路径,然后关闭路径。而已。

此外,它不是内存泄漏,我正在模拟器中的 Mac 上进行测试,并且我有足够的可用内存用于所有可能的对象。问题出在其他地方。

4

1 回答 1

3

从堆栈跟踪中可以清楚地看出,您的递归对于堆栈来说太深了。即使有很多可用的 RAM,堆栈也是有限的。最大堆栈大小有点不清楚,但我认为它可能不超过 1MB。

于 2013-05-01T18:05:58.480 回答