2013-02-04 68 views
2

iOS的初學者在這裏。我想對於一個新聞網站創建一個RSS閱讀器中,RSS解析器工作正常,但它給人的異常EXC_BAD_ACCESS(代碼= 2個地址= 0xC的),如果它與ARC編譯啓用。的NSXMLParser擺脫EXC_BAD_ACCESS時ARC啓用

這是我如何調用解析器:(在我的視圖控制器)

NSMutableArray* articleListMainPage; 

- (void)viewDidLoad 
{ 
    NSURL *mainFeed = [[NSURL alloc]initWithString:@"http://my.domain.com/rss.xml"]; 
    NSXMLParser *nsXmlParser = [[NSXMLParser alloc] initWithContentsOfURL:mainFeed]; 
    NewsParser *myparser = [[NewsParser alloc] initNewsParser]; 
    [nsXmlParser setDelegate:myparser]; 

    if ([nsXmlParser parse]) { 
     NSLog(@"Parsed article count : %i", [myparser.articles count]); 
     articleListMainPage = [myparser.articles copy]; 
    } else { 
     NSLog(@"Error parsing document!"); 
    } 
    nsXmlParser = nil; 
    mainFeed = nil; 
    myparser = nil; // This line throws the exception. 

    [super viewDidLoad]; 
} 

和這裏的解析器本身:

// NewsParser.m 
#import "NewsParser.h" 
#import "RSSEntry.h" 

@implementation NewsParser 

@synthesize article, articles, currValue; 

- (NewsParser *) initNewsParser 
{ 
    if (self = [super init]) return self; else return nil; 
} 

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

    if ([elementName isEqualToString:@"channel"]) { 
     self.articles = [[NSMutableArray alloc] init]; 
    } 
    if ([elementName isEqualToString:@"item"]) { 
     self.article = [[ArticleEntry alloc] init]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (!currValue) { 
     self.currValue = [[NSMutableString alloc] initWithString:string]; 
    } else { 
     [self.currValue appendString:string]; 
    } 
} 

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

    if ([elementName isEqualToString:@"channel"]) { 
     return; 
    } 

    if ([elementName isEqualToString:@"item"]) { 
     [self.articles addObject:self.article]; 
     self.article = nil; 
    } else { 
     if ([[NSArray arrayWithObjects:@"title",@"link",@"description",nil] containsObject:elementName]) 
      [self.article setValue:self.currValue forKey:elementName]; 
    } 
    self.currValue = nil; 
} 

@end 

//NewsParser.h 

#import <Foundation/Foundation.h> 
#import "RSSEntry.h" 

@interface NewsParser : NSXMLParser <NSXMLParserDelegate> { 
    NSMutableString *currValue; 
    NSMutableArray *articles; 
    ArticleEntry *article; 
} 
- (NewsParser *) initNewsParser; 
@property (nonatomic,retain) ArticleEntry *article; 
@property (nonatomic,retain) NSMutableArray *articles; 
@property (nonatomic,retain) NSMutableString *currValue; 
@end 

..我使用保存在RSS條目的類。

//RSSEntry.h 
#import <Foundation/Foundation.h> 

@interface ArticleEntry : NSObject { 
    NSString *title; 
    NSString *link; 
    NSString *description; 
} 

@property (nonatomic, retain) NSString *title; 
@property (nonatomic, retain) NSString *link; 
@property (nonatomic, retain) NSString *description; 

- (id)initNewArticle:(NSString*)_title url:(NSString*)_link description:(NSString*)_desc; 

@end 

//RSSEntry.m 

#import "RSSEntry.h" 

@implementation ArticleEntry 
@synthesize title,link,description; 
- (id)initNewArticle:(NSString *)_title url:(NSString *)_link description:(NSString *)_desc 
{ 
    if ((self = [super init])) { 
     title = [_title copy]; 
     link = [_link copy]; 
     description = [_desc copy]; 
     return self; 
    } 
    else return nil; 
} 
@end 

就像我說的,它的工作原理沒有ARC很好,但我想知道如果我做一些我不應該做(例如保留的東西,我不應該或不正確釋放的東西/在編碼中過度放置東西)。

感謝您的時間..

+0

您是否嘗試過上運行代碼「分析」?轉到Xcode中的「產品 - >分析」:)它會爲您找到內存問題。 –

+0

請發佈堆棧跟蹤。 – trojanfoe

+0

嗨,正如Cupcake所說,運行analizer。我只是給你一個先看看檢討,你有內存泄漏的位置: 如果([的ElementName isEqualToString:@ 「通道」]){ self.articles = [[NSMutableArray裏的alloc]初始化]。 } 如果([的ElementName isEqualToString:@ 「項」]){ self.article = [[ArticleEntry的alloc] INIT]; } – DarthMike

回答

0

因此,這裏的一個問題是,你宣佈NewsParser是的NSXMLParser,它不應該是一個子類。它應該是NSObject的子類(或其他適當的東西)在NewsParser.h

所以,試試這個:

@interface NewsParser : NSObject <NSXMLParserDelegate> 

順便說一句,你有內存泄漏有沒有ARC。分析器可以幫助您解決這些問題,如果您打算在沒有ARC的情況下再次編譯此代碼。不管有沒有ARC,沒有垃圾收集器在這裏(這聽起來就好像你是在一個計數?)

+0

那麼修好了。我不明白NewsParser是NSXMLParser的子類如何導致它崩潰,但我會採取它。 –

+0

我不明白的是我如何使用分析儀來解決內存泄漏,我剛剛得到的消息「分析成功」當我使用它,沒有什麼事情發生。 –

+0

就得看它自己在LLDB,但你沒有調用指定初始化爲超,造成超類的dealloc失敗。無論如何,在大多數情況下,您沒有理由繼承NSXMLParser。代表模式是正確的選擇。 –