【发布时间】: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