2013-10-09 5 views
1

Я анализирую данные из XML-файла и считаю, что нашел цикл сохранения. У меня нет лучшего понимания, как это исправить. Короче говоря, я разбираю кучу поплавков внутри блока, что приводит к тому, что мое использование памяти проходит через крышу - оно превышает 250 МБ. Нехорошо. Вот код:Возможный цикл сохранения - iOS/Objective - C

[TBXML iterateElementsForQuery:@"library_animations" fromElement:rootElement withBlock:^(TBXMLElement *anElement) { 
     [self parseLibraryAnimationsElement:anElement]; 
}]; 

Описанный выше метод вызывает следующий метод:

- (void)parseLibraryAnimationsElement:(TBXMLElement *)element 
{ 
    [TBXML iterateElementsForQuery:@"animation" fromElement:element withBlock:^(TBXMLElement *anElement) { 
     TBXMLElement *extraElement = [TBXML childElementNamed:@"extra" parentElement:anElement]; 
     TBXMLElement *techniqueElement = [TBXML childElementNamed:@"technique" parentElement:extraElement]; 

     // grab float data 
     **NSData *floatData = [self extractFloatArrayFromElement:techniqueElement];** 

     // append data per animation ID 
     NSString *key = [NSString stringWithFormat:@"#%@", [TBXML valueOfAttributeNamed:@"id" forElement:anElement]]; 
     [self.root.sortedAnimationKeys addObject:key]; 

     // use float data to store color information for this frame 
     for (COLLADAMeshGeometry *geometry in self.root.geometries.allValues) { 
      AGLKMesh *mesh = geometry.mesh; 

      NSMutableData *dynamicColorData = [NSMutableData data]; 
      GLKVector3 *newColorInfo = (GLKVector3 *)[floatData bytes]; 

      // cycle through vertices for this mesh and use color float array information 
      for (int i = 0; i < mesh.numberOfVertices; i++) { 
       AGLKMeshVertex *staticVertex = [mesh vertexAtIndex:i]; 
       GLKVector3 newColor = newColorInfo[staticVertex->colorIndex]; 
       GLKVector4 color = GLKVector4Make(newColor.x, newColor.y, newColor.z, 1.0); 

       [dynamicColorData appendBytes:&color length:sizeof(color)]; 
      } 

      // get key and store in animation dictionary on the mesh 
      [mesh.animationBufferDictionary setObject:dynamicColorData forKey:key]; 
     } 
    }]; 

    // sort animation keys 
    if (self.root.sortedAnimationKeys.count > 0) { 
     [self.root.sortedAnimationKeys sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
    } 
} 

Метод между ** ... ** также ниже. Вот где я считаю, что проблема. Строки не освобождаются должным образом.

- (NSData *)extractFloatArrayFromElement:(TBXMLElement *)element 
{ 
    // element is <source> 
    NSMutableData *floatData = [NSMutableData data]; 
    TBXMLElement *floatElement = [TBXML childElementNamed:@"float_array" parentElement:element]; 
    NSString *stringValues = [TBXML textForElement:floatElement]; 

    NSArray *values = [stringValues componentsSeparatedByString:@" "]; 
    for (NSString *value in values) { 
     float floatValue = [value floatValue]; 
     [floatData appendBytes:&floatValue length:sizeof(floatValue)]; 
    } 

    return floatData; 
} 

Я говорю, что это где-то здесь, потому что, когда я использую Отчисление инструмент я получаю огромное количество CFStrings, как вы можете видеть на скриншоте ниже. Я не уверен, что это достаточно информации или нет, но если кто-то может увидеть какие-либо вопросы, дайте мне знать. В противном случае, может быть, есть шаг в правильном направлении, который я могу предпринять. enter image description here

Когда я детализировать в (неизменную) линию CFString, он имеет ряд линий, что они созданы в [NSString componentsSeparatedByString:].

ответ

0

Изменить это:

- (NSData *)extractFloatArrayFromElement:(TBXMLElement *)element 
{ 
    // element is <source> 
    NSMutableData *floatData = [NSMutableData data]; 
    TBXMLElement *floatElement = [TBXML childElementNamed:@"float_array" parentElement:element]; 
    NSString *stringValues = [TBXML textForElement:floatElement]; 

    NSArray *values = [stringValues componentsSeparatedByString:@" "]; 
    for (NSString *value in values) { 
     float floatValue = [value floatValue]; 
     [floatData appendBytes:&floatValue length:sizeof(floatValue)]; 
    } 

    return floatData; 
} 

Для это:

- (NSData *)extractFloatArrayFromElement:(TBXMLElement *)element 
{ 
@autoreleasepool { 
    // element is <source> 
    NSMutableData *floatData = [NSMutableData data]; 
    TBXMLElement *floatElement = [TBXML childElementNamed:@"float_array" parentElement:element]; 
    NSString *stringValues = [TBXML textForElement:floatElement]; 

    NSArray *values = [stringValues componentsSeparatedByString:@" "]; 
    for (NSString *value in values) { 
     float floatValue = [value floatValue]; 
     [floatData appendBytes:&floatValue length:sizeof(floatValue)]; 
    } 

    return floatData; 
} 
} 

Предполагается, что componentsSeparatedByString: является источником тонны автореализованных объектов. Если это не поможет, то:

  • сортироваться отчет в распределениях Инструмента по # байт
  • очередь на «отслеживать только живые объекты» (или как там оно называется)
  • поворот на " отслеживать счетчик ссылок на события»
  • нажмите до объектов, а затем щелкают через к созданию единого объекта

Это должно сказать вам, что в вашем коде запуская распределение. Оттуда дело обстоит более эффективно.

0

Это может быть очень хорошо самоблокирующиеся объекты, которые висят вокруг в каком-то авторешетке.

Чтобы освободить их, разместите пулы авторешетки внутри петель или, возможно, внутри вашего метода extractFloatArrayFromElement.

Другое измерение, чтобы избежать создания объекта авто выпущен, чтобы избежать фабричных методов класса, например:

NSMutableData* autoreleasedObject = [NSMutableData data]; 

Вместо этого используйте:

NSMutableData* data = [[NSMutableData alloc] init]; 
+0

Это, к сожалению, ничего не делало. Использование памяти по-прежнему проходит через крышу. – kschins

+0

Затем вам нужно выяснить, какой код фактически присвоил объект, путем проверки распределения с помощью инструментов.В идеале вы получаете точную строку источника, в которой выделен объект, который не будет выпущен и освобожден позже. – CouchDeveloper

+0

Вы также разместили пул автообновлений в пределах блока? – CouchDeveloper

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