Я анализирую данные из 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, как вы можете видеть на скриншоте ниже. Я не уверен, что это достаточно информации или нет, но если кто-то может увидеть какие-либо вопросы, дайте мне знать. В противном случае, может быть, есть шаг в правильном направлении, который я могу предпринять.
Когда я детализировать в (неизменную) линию CFString, он имеет ряд линий, что они созданы в [NSString componentsSeparatedByString:]
.
Это, к сожалению, ничего не делало. Использование памяти по-прежнему проходит через крышу. – kschins
Затем вам нужно выяснить, какой код фактически присвоил объект, путем проверки распределения с помощью инструментов.В идеале вы получаете точную строку источника, в которой выделен объект, который не будет выпущен и освобожден позже. – CouchDeveloper
Вы также разместили пул автообновлений в пределах блока? – CouchDeveloper