2013-11-28 3 views
-1

Я использую инструменты, и у меня много памяти просачивается этим методом. Он используется везде в моем приложении, и когда я его построил, я использовал некоторый C++ (я думаю).Утечка памяти в коде obj-c/C++

Пожалуйста, дайте мне знать, где происходит утечка, если это возможно?

инструментов просто говорят Malloc 16 байт и имеют около 60 МБ общих стоимости этих ребят ...

/* 
Parses a dicionary into an object 
*/ 
+(id)makeObject:(id)object fromDictionary:(NSDictionary *)dict{ 

    @autoreleasepool { 
     NSArray *keys = @[@"@\"NSMutableArray\""]; 

     //Init result 
     id result = object; 

     //Iterate every key 
     for (id key in [dict allKeys]) { 

      //Convert key to const char 
      const char * c = [key cStringUsingEncoding:NSASCIIStringEncoding]; 

      //Use c to see if the class has this property 
      if (class_getProperty([object class], c)) { 

       //get the property 
       objc_property_t property = class_getProperty([result class], c); 

       //Get the property name and type 
       const char *name = property_getName(property); 
       const char *type = property_copyAttributeValue(property, "T"); 

       //Cast const char to string 
       NSString *pNameString = [NSString stringWithFormat:@"%s",name]; 
       NSString *typeString = [NSString stringWithFormat:@"%s",type]; 

       //Add relationships 
       if ([keys containsObject:typeString]) { 

        //Get array of objects 
        NSArray *relationship = [dict objectForKey:pNameString]; 

        NSMutableArray *allSubObjects = [[NSMutableArray alloc]init]; 
        //Parse each individual object 
        for (NSDictionary *relationshipObj in relationship) { 

         //Create class from relationship 
         Class class = NSClassFromString(pNameString); 

         //Create object 
         id sub = [self makeObject:[[class alloc]init] fromDictionary:relationshipObj]; 

         [allSubObjects addObject:sub]; 
        } 

        [result setValue:allSubObjects forKey:pNameString]; 
       }else{ 
        //If so set the property for the key 
        [result setValue:[dict objectForKey:key] forKey:key]; 
       } 

      }else{ 
       //NSLog(@"%@ did not respond to : %@", result, key); 
      } 


     } 

     //Return result 
     return result; 
    } 

} 

EDIT:

Instruments показывает эти два элемента, скорее всего преступник. Каков наилучший способ исправить это?

//Cast const char to string 
        NSString *pNameString = [NSString stringWithFormat:@"%s",name]; 
        NSString *typeString = [NSString stringWithFormat:@"%s",type]; 
+0

Объявить это распределение из цикла for (Мастер) NSMutableArray * allSubObjects = [[NSMutableArray alloc] init]; и проверьте один раз. – Ganapathy

+0

попытайтесь изменить NSMutableArray * allSubObjects = [NSMutableArray array]; чтобы создать автореализованный экземпляр – alex

+0

Просто попробовал ... Утечки все еще там –

ответ

1

1) [NSString cStringUsingEncoding]

Это выделить память внутренне, которая не будет освобождена, пока объект NSString не освобождаться. Я точно не знаю, но возможно ли повторять отправку cStringUsingEncoding повлечет за собой неиспользованное наращивание памяти?

2) property_copyAttributeValue

документация говорит,

Возвращаемое значение A C массив указателей типа objc_property_t, описывающих свойства, объявленные прото. Любые свойства, объявленные другими протоколами , принятые этим протоколом, не включены. Массив содержит * outCount указатели, за которым следует NULL-терминатор. Вы должны освободить массив со свободным().

Вам необходимо бесплатно загрузить const char *type.

3) NSMutableArray *allSubObjects = [[NSMutableArray alloc]init]

Это должно быть NSMutableArray *allSubObjects = [NSMutableArray array].

4) Создание объекта

Class class = NSClassFromString(pNameString);  
//Create object 
id sub = [self makeObject:[[class alloc]init] fromDictionary:relationshipObj]; 

Я бы поставил этот блок кода в своем собственном autorelease бассейне.
[class alloc]init] также является подозрительным.

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