使用ARC的递归方法中的EXC_BAD_ACCESS代码= 2

时间:2013-05-01 15:18:36

标签: ios objective-c xcode

我需要实现一个递归函数,将图像分割成多个小图像,用于益智游戏。

编辑:这是ShapeObject的类init方法的外观(目前仅支持圆圈)         // ShapeObject的初始化方法

//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];

}

堆栈跟踪: enter image description here

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

我在后台线程中完成所有这些操作,但是一旦启动该功能,我就会获得EXC_BAD_ACCESS代码2。

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

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

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

1 个答案:

答案 0 :(得分:3)

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