【问题标题】:Memory management issue内存管理问题
【发布时间】:2011-04-18 16:32:46
【问题描述】:

目前,我在创建 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;
}

但由于某种原因,当我检查 Instruments 以了解内存分配时,分配给 testFile = [[TestFile alloc] init] 的内存空间大约为 32 KB,这导致应用程序无法在 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;

}

【问题讨论】:

  • 你认为这是“有史以来最严重的问题” - 你不认为你在那儿只是有点夸张吗? :-) 严肃地说,我认为您的意思是 32MB 而不是 32KB?
  • TestFile 类声明是什么样的,它的init 方法有什么作用?如果该类分配了大量内存,那么这与您的 XML 解析无关。
  • @middaparka:我并不想表现得那么夸张,只是处理内存管理的问题并不容易处理。不,分配的空间是 32 KB,为我的应用程序分配的总空间是 210 KB。只是想知道我是否可以用另一种方式做到这一点,或者我在这里做错了。
  • @kristopher :我已经编辑了我的代码以显示我的 TestFile 类声明。
  • 它是如何杀死你的 iPhone 3GS 的?它崩溃了吗?您是否收到内存警告?

标签: iphone objective-c memory memory-management memory-leaks


【解决方案1】:

只是在黑暗中拍摄 - XML 解析可能没问题 - 虽然我没有特别检查你的代码。

我建议您检查UIImage 实例appLogo。一旦实例化,该婴儿将包含一个解码图像(通常每像素 4 个字节)。通常,在查看文件大小时,您可能会遇到看起来足够小的图像。但是,您应该查看它们的总分辨率,以获得将数据保存在内存中所需的有效内存。

另一个建议是在您的解析代码中添加一些日志记录,以查看预期是否实际发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 2011-01-07
    • 2016-10-20
    • 2011-04-11
    • 2013-09-01
    相关资源
    最近更新 更多