Objective c 无法检测内存泄漏的原因

Objective c 无法检测内存泄漏的原因,objective-c,xcode,memory-leaks,Objective C,Xcode,Memory Leaks,在这个函数中,根据Xcode的仪器泄漏工具,我在两个位置上有一个内存泄漏 我没有启用ARC,也无法激活它,因此我必须以另一种方式管理它 +(NSArray *)changePolygonFrom:(NSArray *)polygon size:(float)size{ int nmrOfPoints = [polygon count]; double x[nmrOfPoints]; double y[nmrOfPoints]; for (int i = 0; i

在这个函数中,根据Xcode的仪器泄漏工具,我在两个位置上有一个内存泄漏

我没有启用ARC,也无法激活它,因此我必须以另一种方式管理它

+(NSArray *)changePolygonFrom:(NSArray *)polygon size:(float)size{

    int nmrOfPoints = [polygon count];
    double x[nmrOfPoints];
    double y[nmrOfPoints];
    for (int i = 0; i < nmrOfPoints; i++) {
        CGPoint p = [[polygon objectAtIndex:i] CGPointValue];
        x[i] = p.x;
        y[i] = p.y;
    }

    insetPolygon(x,y,nmrOfPoints,size);

    NSMutableArray *rPolygon = [[NSMutableArray alloc] initWithCapacity:nmrOfPoints];
    for(int i = 0; i < nmrOfPoints; i++){
        CGPoint p = CGPointMake(x[i], y[i]);
        NSValue *val = [NSValue valueWithCGPoint:p];
        [rPolygon addObject:val];
    }

    return rPolygon;
}
如果我在rPolygon上使用Auto release,我将无法访问对象iFrame和oFrame,因为它们是上一个函数返回的产品

-(void)drawAreaFuzzWithOuterFrame:(NSArray *)oFrame andInnerFrame:(NSArray *)iFrame withColor:(ccColor4B)c{
    for(int i = 0; i < [oFrame count]; i++){

        CGPoint oP1 = [[oFrame objectAtIndex:i] CGPointValue];
        CGPoint iP1 = [[iFrame objectAtIndex:i] CGPointValue];

        CGPoint oP2;
        CGPoint iP2;

        if(i == [oFrame count]-1){
            oP2 = [[oFrame objectAtIndex:0]   CGPointValue];
            iP2 = [[iFrame objectAtIndex:0]   CGPointValue];
        }else{
            oP2 = [[oFrame objectAtIndex:i+1]   CGPointValue];
            iP2 = [[iFrame objectAtIndex:i+1]   CGPointValue];
        }

        GLfloat vertices[] = {
            oP1.x,oP1.y,
            oP2.x,oP2.y,
            iP1.x,iP1.y,
            iP2.x,iP2.y,
        };

        GLubyte colors[] = {
            c.r,c.g,c.b,c.a,
            c.r,c.g,c.b,c.a,
            c.r,c.g,c.b,0,
            c.r,c.g,c.b,0,
        };

        BEdrawGLShapeWithVertices(vertices, colors);
    }
}
-(void)绘图区域模糊,不带外框:(NSArray*)的名称和内框:(NSArray*)带颜色的内框:(ccColor4B)c{
对于(int i=0;i<[of name count];i++){
CGPoint oP1=[[oFrame objectAtIndex:i]CGPointValue];
CGPoint iP1=[[iFrame objectAtIndex:i]CGPointValue];
cgp2点;
CGPoint-iP2;
if(i==[oFrame count]-1){
oP2=[[oFrame objectAtIndex:0]CGPointValue];
iP2=[[iFrame objectAtIndex:0]CGPointValue];
}否则{
oP2=[[oFrame objectAtIndex:i+1]CGPointValue];
iP2=[[iFrame objectAtIndex:i+1]CGPointValue];
}
GLfloat顶点[]={
oP1.x,oP1.y,
oP2.x,oP2.y,
iP1.x,iP1.y,
iP2.x,iP2.y,
};
GLubyte颜色[]={
c、 r,c.g,c.b,c.a,
c、 r,c.g,c.b,c.a,
c、 r,c.g,c.b,0,
c、 r,c.g,c.b,0,
};
BedRawGLShapeWith顶点(顶点、颜色);
}
}

您必须将NSMutableArray标记为自动释放:

NSMutableArray *rPolygon = [[[NSMutableArray alloc] initWithCapacity:nmrOfPoints] autorelease];

如果您不这样做,您将创建它,保留它,然后返回它。它从未发布。

您在声明rPolygon时忘记了自动释放:

编辑 似乎没有保留
+(NSArray*)changePolygonFrom:(NSArray*)polygon size:(float)size
方法的结果

尝试更改您的代码保留
largeFuzzPolygon
smallFuzzPolygon
(记住也要用dealloc方法释放它们):

或者更好,我建议您合成它们并使用以下代码:

-(void)fixFuzArrays{
    if (fuzzFix) {
        self.largeFuzzPolygon = [[Triangulation changePolygonFrom:normalPolygon size:(shortestDistance/2)] retain];
        self.smallFuzzPolygon = [[Triangulation changePolygonFrom:normalPolygon size:(shortestDistance/6)] retain];
    }else{
        self.largeFuzzPolygon = [[Triangulation changePolygonFrom:normalPolygon size:-(shortestDistance/2)] retain];
        self.smallFuzzPolygon = [[Triangulation changePolygonFrom:normalPolygon size:-(shortestDistance/6)] retain];
    }
}

您必须在返回数组之前自动释放该数组,然后在接收该数组的方法中保留该数组

autorelease
添加到
NSMutableArray

NSMutableArray *rPolygon = [[[NSMutableArray alloc] initWithCapacity:nmrOfPoints] autorelease];
然后将retain放在使用函数的方法上,但以后必须释放它

NSArray *myArray = [[MyClass changePolygonFrom:array size:size] retain];

不要忘了稍后发布
myArray
这会使它在我使用收到的阵列时崩溃。因此,代码的另一部分有问题:你能发布吗?正如Marco所说,我输入的代码很好,你的问题在另一部分。感谢代码,但我没有看到对“changePolygonFrom”方法的任何调用。我假设您使用该方法创建了一个数组,以后再使用它。你能把代码贴在使用“changePolygonFrom”方法的地方吗?这会使它在我使用收到的阵列时崩溃谢谢!我没想过要保留。但这就成功了!
-(void)fixFuzArrays{
    if (fuzzFix) {
        self.largeFuzzPolygon = [[Triangulation changePolygonFrom:normalPolygon size:(shortestDistance/2)] retain];
        self.smallFuzzPolygon = [[Triangulation changePolygonFrom:normalPolygon size:(shortestDistance/6)] retain];
    }else{
        self.largeFuzzPolygon = [[Triangulation changePolygonFrom:normalPolygon size:-(shortestDistance/2)] retain];
        self.smallFuzzPolygon = [[Triangulation changePolygonFrom:normalPolygon size:-(shortestDistance/6)] retain];
    }
}
NSMutableArray *rPolygon = [[[NSMutableArray alloc] initWithCapacity:nmrOfPoints] autorelease];
NSArray *myArray = [[MyClass changePolygonFrom:array size:size] retain];