Проблема управления памятью - PullRequest
0 голосов
/ 18 апреля 2011

В настоящее время я сталкиваюсь с самой серьезной проблемой всех времен при создании приложений для iPhone, которая связана с управлением памятью. Я читаю файл XML и храню в базе данных с помощью SQLITE. Читая файл XML, я создаю объект из файла класса TestFile и выделяю для него место. Поэтому, когда он читает начальный тег, он выделяет пространство, а когда находит конечный тег, он освобождает пространство и освобождает для следующих тегов. // класс TestFile

@interface TestFile : NSObject {

NSString *id;
NSString *number;
NSNumber *size_A;
NSNumber *size_B;
NSNumber *places;
NSString *spaces;
NSString *name;
NSString *print;
NSString *description;
NSNumber *formats;
NSString *purchases;
NSNumber *active;
UIImage *appLogo;
NSUInteger starred;
}

Но по какой-то причине, когда я проверяю приборы на предмет выделения памяти, пространство памяти, выделенное для testFile = [[TestFile alloc] init], составляет около 32 КБ, что убивает приложение для загрузки на iphone 3GS. Я что-то здесь не так делаю или я могу сделать что-то другое?

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {

if([elementName isEqual:@"root"]) {
    self.exhArray = [NSMutableArray array] ;
}

else if([elementName isEqualToString:@"object"])
{
    testFile = [[TestFile alloc] init] ;
}
}

  - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

if(!currentElementValue) 
    currentElementValue = [[NSMutableString alloc] initWithString:string];
else
    [currentElementValue appendString:string];
}

 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

     if([elementName isEqualToString:@"root"])
    return;

     if([elementName isEqualToString:@"object"]) {
    [self.exhArray addObject:testFile];
    [testFile release];
    testFile = nil;
}
else if([elementName isEqualToString:@"key_id"])
    [testFile setValue:currentElementValue forKey:elementName];
 [currentElementValue release];
currentElementValue = nil;

}

1 Ответ

0 голосов
/ 18 апреля 2011

Просто выстрел в темноте - синтаксический анализ XML может быть в порядке - хотя я не слишком проверял ваш код.

Я бы посоветовал вам проверить UIImage экземпляр appLogo. После создания экземпляра этот ребенок будет содержать декодированное изображение (обычно 4 байта на пиксель). Достаточно часто вы можете встретить изображения, которые кажутся достаточно маленькими, если посмотреть на их размер. Однако вам следует взглянуть на их полное разрешение, чтобы получить эффективную память, необходимую для хранения этих данных в памяти.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...