2013-12-04 4 views
0

В этой функции у меня есть утечка памяти в двух местах в соответствии с инструментом утечки инструмента 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 я получаю BAD_ACCESS на объекты 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); 
    } 
} 

ответ

1

Вы должны автоопределить массив перед его возвратом, а затем сохранить массив в методе, который его принимает

добавить autorelease к NSMutableArray

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

, а затем положить сохранить на метод, который используют вашу функцию, но вам придется выпустить его позже

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

Не забудьте освободить myArray позже

+0

Спасибо, сэр! я не думал о сохранении. но это сделало трюк! – Birdey

0

Вы должны отметить NSMutableArray, как autorelease:

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

Если вы этого не сделаете, вы создаете его, сохраняя его, а затем возвращаете. Он никогда не выпускается.

+0

Это приводит к сбою позже, когда im использует полученный массив – Birdey

0

Вы забыли об autorelease декларируя rPolygon:

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

EDIT кажется, что вы не сохранили результат метода +(NSArray *)changePolygonFrom:(NSArray *)polygon size:(float)size.

Попробуйте изменить код сохранения largeFuzzPolygon и smallFuzzPolygon (не забудьте освободить их в методе 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]; 
    } 
} 
+0

Это приводит к сбою позже, когда im использует полученный массив – Birdey

+0

Итак, У вас есть проблема в другой части кода: можете ли вы опубликовать его? –

+0

Как сказал Марко, этот код я положил, ваша проблема в другой части –

Смежные вопросы