Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSXMLParser NSCFString内存泄漏_Iphone_Memory Leaks_Nsstring_Nsxmlparser - Fatal编程技术网

Iphone NSXMLParser NSCFString内存泄漏

Iphone NSXMLParser NSCFString内存泄漏,iphone,memory-leaks,nsstring,nsxmlparser,Iphone,Memory Leaks,Nsstring,Nsxmlparser,我正在构建一个解析rss提要的应用程序。在应用程序中,有两种不同类型的提要,提要中的元素具有不同的名称,因此我创建了一个NSXMLParser NSObject,在解析之前获取每个提要元素的名称。这是我的密码: NewsFeedParser.h #import @interface NewsFeedParser : NSObject { NSInteger NewsSelectedCategory; NSXMLParser *NSXMLNewsParser; NSM

我正在构建一个解析rss提要的应用程序。在应用程序中,有两种不同类型的提要,提要中的元素具有不同的名称,因此我创建了一个NSXMLParser NSObject,在解析之前获取每个提要元素的名称。这是我的密码:

NewsFeedParser.h

#import @interface NewsFeedParser : NSObject { NSInteger NewsSelectedCategory; NSXMLParser *NSXMLNewsParser; NSMutableArray *newsCategories; NSMutableDictionary *NewsItem; NSMutableString *NewsCurrentElement, *NewsCurrentElement1, *NewsCurrentElement2, *NewsCurrentElement3; NSString *NewsItemType, *NewsElement1, *NewsElement2, *NewsElement3; NSInteger NewsNumElements; } - (void) parseXMLFileAtURL:(NSString *)URL; @property(nonatomic, retain) NSString *NewsItemType; @property(nonatomic, retain) NSString *NewsElement1; @property(nonatomic, retain) NSString *NewsElement2; @property(nonatomic, retain) NSString *NewsElement3; @property(nonatomic, retain) NSMutableArray *newsCategories; @property(assign, nonatomic) NSInteger NewsNumElements; @end #进口 @接口NewsFeedParser:NSObject{ NSInteger新闻选择类别; NSXMLParser*NSXMLNewsParser; NSMutableArray*新闻类别; NSMutableDictionary*新闻项; NSMutableString*NewsCurrentElement、*NewsCurrentElement1、*NewsCurrentElement2、*NewsCurrentElement3; NSString*NewsItemType、*NewsElement1、*NewsElement2、*NewsElement3; NSInteger新闻; } -(void)parseXMLFileAtURL:(NSString*)URL; @属性(非原子,保留)NSString*NewsItemType; @属性(非原子,保留)NSString*NewElement1; @属性(非原子,保留)NSString*NewElement2; @属性(非原子,保留)NSString*NewElement3; @属性(非原子,保留)NSMutableArray*新闻类别; @属性(赋值,非原子)集成器新闻元素; @结束 NewsFeedParser.m

#import "NewsFeedParser.h" @implementation NewsFeedParser @synthesize NewsItemType; @synthesize NewsElement1; @synthesize NewsElement2; @synthesize NewsElement3; @synthesize newsCategories; @synthesize NewsNumElements; - (void)parserDidStartDocument:(NSXMLParser *)parser{ } - (void)parseXMLFileAtURL:(NSString *)URL { newsCategories = [[NSMutableArray alloc] init]; URL = [URL stringByReplacingOccurrencesOfString:@" " withString:@""]; URL = [URL stringByReplacingOccurrencesOfString:@"\n" withString:@""]; URL = [URL stringByReplacingOccurrencesOfString:@" " withString:@""]; //you must then convert the path to a proper NSURL or it won't work NSURL *xmlURL = [NSURL URLWithString:URL]; // here, for some reason you have to use NSClassFromString when trying to alloc NSXMLParser, otherwise you will get an object not found error // this may be necessary only for the toolchain [[NSURLCache sharedURLCache] setMemoryCapacity:0]; [[NSURLCache sharedURLCache] setDiskCapacity:0]; NSXMLNewsParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; // Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks. [NSXMLNewsParser setDelegate:self]; // Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser. [NSXMLNewsParser setShouldProcessNamespaces:NO]; [NSXMLNewsParser setShouldReportNamespacePrefixes:NO]; [NSXMLNewsParser setShouldResolveExternalEntities:NO]; [NSXMLNewsParser parse]; [NSXMLNewsParser release]; } - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSString * errorString = [NSString stringWithFormat:@"Unable to download story feed from web site (Error code %i )", [parseError code]]; NSLog(@"error parsing XML: %@", errorString); UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [errorAlert show]; [errorAlert release]; [errorString release]; } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ NewsCurrentElement = [elementName copy]; if ([elementName isEqualToString:NewsItemType]) { // clear out our story item caches... NewsItem = [[NSMutableDictionary alloc] init]; NewsCurrentElement1 = [[NSMutableString alloc] init]; NewsCurrentElement2 = [[NSMutableString alloc] init]; if(NewsNumElements == 3) { NewsCurrentElement3 = [[NSMutableString alloc] init]; } } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ if ([elementName isEqualToString:NewsItemType]) { // save values to an item, then store that item into the array... [NewsItem setObject:NewsCurrentElement1 forKey:NewsElement1]; [NewsItem setObject:NewsCurrentElement2 forKey:NewsElement2]; if(NewsNumElements == 3) { [NewsItem setObject:NewsCurrentElement3 forKey:NewsElement3]; } [newsCategories addObject:[[NewsItem copy] autorelease]]; [NewsCurrentElement release]; [NewsCurrentElement1 release]; [NewsCurrentElement2 release]; if(NewsNumElements == 3) { [NewsCurrentElement3 release]; } [NewsItem release]; } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { //NSLog(@"found characters: %@", string); // save the characters for the current item... if ([NewsCurrentElement isEqualToString:NewsElement1]) { [NewsCurrentElement1 appendString:string]; } else if ([NewsCurrentElement isEqualToString:NewsElement2]) { [NewsCurrentElement2 appendString:string]; } else if (NewsNumElements == 3 && [NewsCurrentElement isEqualToString:NewsElement3]) { [NewsCurrentElement3 appendString:string]; } } - (void)dealloc { [super dealloc]; [newsCategories release]; [NewsItemType release]; [NewsElement1 release]; [NewsElement2 release]; [NewsElement3 release]; } #导入“NewsFeedParser.h” @NewsFeedParser的实现 @综合新闻条目类型; @合成新闻元素1; @合成新闻元素2; @合成新闻元素3; @综合新闻类别; @综合新闻材料; -(void)parserdistartdocument:(NSXMLParser*)解析器{ } -(void)parseXMLFileAtURL:(NSString*)URL { newsCategories=[[NSMutableArray alloc]init]; URL=[URL stringByReplacingOccurrencesOfString:@“with String:@]”; URL=[URL stringByReplacingOccurrencesOfString:@“\n”带字符串:@”“; URL=[URL stringByReplacingOccurrencesOfString:@“with String:@]”; //然后必须将路径转换为正确的NSURL,否则它将无法工作 NSURL*xmlURL=[NSURL URLWithString:URL]; //在这里,由于某些原因,在尝试分配NSXMLParser时必须使用NSClassFromString,否则将出现“未找到对象”错误 //这可能仅适用于工具链 [[NSURLCache sharedURLCache]设置内存容量:0]; [[NSURLCache sharedURLCache]设置磁盘容量:0]; NSXMLNewsParser=[[NSXMLParser alloc]initWithContentsOfURL:xmlURL]; //将self设置为解析器的委托,以便它将接收解析器委托方法回调。 [NSXMLNewsParser setDelegate:self]; //根据您正在解析的XML文档,您可能希望启用NSXMLParser的这些功能。 [NSXMLNewsParser setShouldProcessNamespaces:否]; [NSXMLNewsParser SetShouldReportNamespace前缀:否]; [NSXMLNewsParser setShouldResolveExternalEntities:否]; [NSXMLNewsParser parse]; [NSXMLNewsParser发行版]; } -(void)解析器:(NSXMLParser*)解析器解析错误发生:(NSError*)解析错误{ NSString*errorString=[NSString stringWithFormat:@“无法从网站下载故事提要(错误代码%i)”,[parseError code]]; NSLog(@“错误解析XML:%@”,errorString); UIAlertView*errorAlert=[[UIAlertView alloc]initWithTitle:@“加载内容时出错”消息:errorString委托:自取消按钮:@“确定”其他按钮:nil]; [错误警报显示]; [错误警报发布]; [错误字符串释放]; } -(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName属性:(NSDictionary*)attributeDict{ NewsCurrentElement=[elementName copy]; if([elementName IsequalString:NewsItemType]) { //清除我们的故事项目缓存。。。 NewsItem=[[NSMutableDictionary alloc]init]; NewsCurrentElement1=[[NSMutableString alloc]init]; NewsCurrentElement2=[[NSMutableString alloc]init]; if(NewsNumElements==3) { NewsCurrentElement3=[[NSMutableString alloc]init]; } } } -(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName{ if([elementName IsequalString:NewsItemType]) { //将值保存到项,然后将该项存储到数组中。。。 [NewsItem setObject:NewsCurrentElement1 forKey:NewsElement1]; [NewsItem setObject:NewsCurrentElement2 forKey:NewsElement2]; if(NewsNumElements==3) { [NewsItem setObject:NewsCurrentElement3 forKey:NewsElement3]; } [newsCategories添加对象:[[NewsItem copy]自动删除]]; [新闻元素发布]; [NewsCurrentElement1发布]; [NewsCurrentElement2发布]; if(NewsNumElements==3) { [NewsCurrentElement3发布]; } [新闻发布]; } } -(void)解析器:(NSXMLParser*)解析器查找字符:(NSString*)字符串 { //NSLog(@“找到的字符:%@”,字符串); //保存当前项目的字符。。。 if([NewsCurrentElement IsequalString:NewsElement1]){ [NewsCurrentElement1 appendString:string]; }else if([NewsCurrentElement IsequalString:NewsElement2]){ [NewsCurrentElement2 appendString:string]; }else if(NewsNumElements==3&&[NewsCurrentElement IsequalString:NewsElement3]) { [NewsCurrentElement3 appendString:string]; } } -(无效)解除锁定{ [super dealoc]; [新闻类别发布]; [新闻项目类型发布]; [新闻元素1发布]; [新闻元素2发布]; [新闻元素3发布]; } 当我创建类的实例时,我喜欢这样做:

NewsFeedParser *categoriesParser = [[NewsFeedParser alloc] init]; if(newsCat == 0) { categoriesParser.NewsItemType = @"article"; categoriesParser.NewsElement1 = @"category"; categoriesParser.NewsElement2 = @"catid"; } else { categoriesParser.NewsItemType = @"article"; categoriesParser.NewsElement1 = @"category"; categoriesParser.NewsElement2 = @"feedUrl"; } [categoriesParser parseXMLFileAtURL:feedUrl]; newsCategories = [[NSMutableArray alloc] initWithArray:categoriesParser.newsCategories copyItems:YES]; [self.tableView reloadData]; [categoriesParser release]; NewsFeedParser*categoriesParser=[[NewsFeedParser alloc]init]; if(newsCat==0) { categoriesParser.NewsItemType=@“文章”; categoriesParser.NewElement1=@“类别”; categoriesParser.newelement2=@“catid”; } 其他的 { categoriesParser.NewsItemType=@“文章”; categoriesParser.NewElement1=@“类别”; categoriesParser.newelement - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ NewsCurrentElement = [[elementName copy] autorelease]; if ([elementName isEqualToString:NewsItemType]) { // clear out our story item caches... NewsItem = [[NSMutableDictionary alloc] init]; NewsCurrentElement1 = [[NSMutableString alloc] init]; NewsCurrentElement2 = [[NSMutableString alloc] init]; if(NewsNumElements == 3) { NewsCurrentElement3 = [[NSMutableString alloc] init]; } } }
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

    if (NewsCurrentElement) {
        [NewsCurrentElement release], NewsCurrentElement = nil;
    }
    NewsCurrentElement = [[elementName copy] autorelease];

    if ([elementName isEqualToString:NewsItemType]) {
        // clear out our story item caches...
        if (NewsItem) {
            [NewsItem release], NewsItem = nil;
        }
        NewsItem = [[NSMutableDictionary alloc] init];

        if (NewsCurrentElement1) {
            [NewsCurrentElement1 release], NewsCurrentElement1 = nil;
        }
        NewsCurrentElement1 = [[NSMutableString alloc] init];

        if (NewsCurrentElement2) {
            [NewsCurrentElement2 release], NewsCurrentElement2 = nil;
        }
        NewsCurrentElement2 = [[NSMutableString alloc] init];

        if(NewsNumElements == 3) {
            if (NewsCurrentElement3) {
                [NewsCurrentElement3 release], NewsCurrentElement3 = nil;
            }
            NewsCurrentElement3 = [[NSMutableString alloc] init];
        }
    }
}