我需要实现一个递归函数,将图像分割成多个小图像,用于益智游戏。
编辑:这是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];
}
在我的逻辑之后它应该像这样工作:检查它是否超出范围&如果它已经添加到数组中。如果没有,则调用邻居,直到所有形状对象都在数组中并遍历整个图片。
我在后台线程中完成所有这些操作,但是一旦启动该功能,我就会获得EXC_BAD_ACCESS代码2。
环顾四周后,我发现代码2与指针有关。
显然问题发生在我在内部创建路径的地方,但我不知道为什么它应该,因为那里没有指针,只是一个简单的CreateMutablePath,从形状,位置和旋转做出实际路径,并关闭路径。就是这样。
此外,它不是内存泄漏,我正在我的Mac模拟器测试,我有足够的内存可用于所有可能的对象。问题出在其他地方。
答案 0 :(得分:3)
从堆栈跟踪可以清楚地看出,您的递归对于堆栈来说太深了。即使有很多可用的RAM,堆栈也是有限的。最大堆栈大小有点不清楚,但我认为它可能不超过1MB。