【问题标题】:Unable to detect cause of memory leak无法检测内存泄漏的原因
【发布时间】:2013-12-04 16:42:42
【问题描述】:

根据 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;
}

这就是我所说的

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

如果我在 rPolygon 上使用自动释放,我会在 iFrame 和 oFrame 对象上获得 BAD_ACCESS,它们是前一个函数的返回产品

-(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);
    }
}

【问题讨论】:

    标签: objective-c xcode memory-leaks


    【解决方案1】:

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

    autorelease 添加到NSMutableArray

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

    然后在使用你的函数的方法上加上保留,但你必须稍后释放它

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

    别忘了稍后发布myArray

    【讨论】:

    • 谢谢先生!我没有考虑保留。但这成功了!
    【解决方案2】:

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

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

    如果你不这样做,你就是在创建它,保留它,然后返回它。它从未发布过。

    【讨论】:

    • 当我使用接收到的数组时,它会在稍后崩溃
    【解决方案3】:

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

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

    编辑 看来你没有保留+(NSArray *)changePolygonFrom:(NSArray *)polygon size:(float)size方法的结果。

    尝试更改保留largeFuzzPolygonsmallFuzzPolygon 的代码(记住也要在dealloc 方法中释放它们):

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

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

    -(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];
        }
    }
    

    【讨论】:

    • 当我使用接收到的数组时,它会在稍后崩溃
    • 那么你在代码的另一部分有问题:你能发布吗?
    • 正如马可所说,我放的代码很好,你的问题在其他部分
    • 感谢代码,但我没有看到对“changePolygonFrom”方法的任何调用。我假设使用该方法您正在创建一个数组并稍后使用它。能否贴出使用“changePolygonFrom”方法的代码?
    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多