- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 NSXMLParser,我得到一个指向 NSConcreteMapTable 的内存泄漏,无论它是什么:
从我的 AppDelegate.m 调用解析器时,泄漏发生在这行代码处:
我已经搜索了解决方案,但看不出我做错了什么。这是我的代码。任何帮助是极大的赞赏。q
// * * * XMLParser.h * * *
#import <Foundation/Foundation.h>
@protocol NSXMLParserDelegate;
@interface XMLParser : NSObject
<NSXMLParserDelegate>
{
NSMutableArray *xmlArray;
BOOL storingCharacters;
float xmlDataVersion;
}
@property (nonatomic, retain) NSMutableArray *xmlArray;
@property (nonatomic) BOOL storingCharacters;
@property (nonatomic, assign) float xmlDataVersion;
-(BOOL)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error;
@end
// * * * XMLParser.m * * *
#import "XMLParser.h"
@implementation XMLParser
@synthesize xmlArray;
@synthesize storingCharacters;
@synthesize xmlDataVersion;
- (BOOL)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error {
BOOL result = YES;
if (xmlArray == nil) {
// this array holds row data extracted from the XML parser didStartElement method
xmlArray = [[NSMutableArray alloc] init];
}
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
if (parser != nil) {
[parser setDelegate:self];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[[parser setShouldResolveExternalEntities:NO];
}
[parser parse];
if (parseError && error) {
*error = parseError;
result = NO;
}
[parser release];
return result;
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if (qName) {
elementName = qName;
}
// Check the data version of the XML Data against my stored value
if ([elementName isEqualToString:@"data"]) {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
self.xmlDataVersion = [[attributeDict objectForKey:@"version"] floatValue];
float storedDataVersion = [userDefaults floatForKey:kDataVersion];
if (self.xmlDataVersion <= storedDataVersion) {
// - - - - -> Abort parsing if the same or earlier data versions
[parser abortParsing];
}
}
if ([elementName isEqualToString:@"FirstColumnName"]) {
storingCharacters = YES;
} else if ([elementName isEqualToString:@"SecondColumnName"]) {
storingCharacters = YES;
// ... total of 16 elements
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (storingCharacters) {
[self.xmlArray addObject:string];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if (qName) {
elementName = qName;
}
// - - - - -> If at the end of a data row, save changes to object model
if ([elementName isEqualToString:@"ROW"]) {
// - - - - -> Make sure the data has the required number of elements before taking any action
if ([self.xmlArray count] == 16) {
// … //Store or Update Data in SQLite store depending on data values
}
[self.xmlArray removeAllObjects];
}
storingCharacters = NO;
}
-(void)dealloc {
[xmlArray release];
[super dealloc];
}
// * * * AppDelegate.m * * *
#import "XMLParser.h"
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSURL *xmlURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"FileName" ofType:@"xml"]];
NSError *parseError = nil;
XMLParser *xmlParse = [[XMLParser alloc] init];
[xmlParse parseXMLFileAtURL:xmlURL parseError:&parseError];
[xmlParse release];
. . .
最佳答案
我在另一个 SO 中找到了解决方案帖子:
使用:
NSData * dataXml = [[NSData alloc] initWithContentsOfURL:URL];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:dataXml];
[dataXml release];
代替:
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
泄漏消失了。
关于xcode - 在 NSConcreteMapTable 中使用 NSXMLParser 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6019240/
我正在开发一个 iPad 应用程序来帮助我在国外管理我的开支。 我有一个带有经典主视图和详细 View 的 Split View。在主视图中有费用 list ,在明细 View 中,你猜怎么着?每一笔
这是我在出现 SKScene 时看到的错误,此错误发生随机并且无法复制 * 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“* 集合 在枚举时发生了变异。” 这是怎么回
我正在使用 NSXMLParser,我得到一个指向 NSConcreteMapTable 的内存泄漏,无论它是什么: 从我的 AppDelegate.m 调用解析器时,泄漏发生在这行代码处: 我已经搜
我在崩溃日志中得到了下一行:[NSConcreteMapTable 分配:键:值:是新的:]此崩溃发生在 iOS 7 上,但不会发生在 iOS 8 上。 在此行之前的某处调用了 NSLayoutCon
我有一个只在 IOS 7 中发生的崩溃,我无法重现它,但它经常发生。有人有答案或至少知道问题出在哪里吗?我已经删除了所有关于 ios7 的警告,但崩溃仍然发生。附上日志。 Thread : Crash
我是一名优秀的程序员,十分优秀!