2

作業中のiPhoneアプリからリークを削除するのに問題があります。データを取得するためにxmlフィードを解析しています。これが私が解析に使用しているコードです

[[NSURLCache sharedURLCache] setMemoryCapacity:0];
    [[NSURLCache sharedURLCache] setDiskCapacity:0]; 
    NSData *xml = [NSData dataWithContentsOfURL: [NSURL URLWithString:@"url link"]];
    self.parser = [[NSXMLParser alloc] initWithData:xml];   


[self.parser setDelegate:self];
[self.parser parse];
[self.parser release];
self.parser=nil;

そして解析コード

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if(![elementName compare:@"item"])
{tempElement = [[XMLElement alloc] init];
}
else if(![elementName compare:@"title"])
{
    self.currentAttribute = [NSMutableString string];
}

else if(![elementName compare:@"link"])
{
    self.currentAttribute = [NSMutableString string];
}
else if(![elementName compare:@"comments"])
{
    self.currentAttribute = [NSMutableString string];
}
else if(![elementName compare:@"pubDate"])
{
    self.currentAttribute = [NSMutableString string];
}
else if(![elementName compare:@"category"])
{
    self.currentAttribute = [NSMutableString string];
}

else if(![elementName compare:@"description"])
{
    self.currentAttribute = [NSMutableString string];
}}

それぞれに漏れがあります

self.currentAttribute = [NSMutableString string];

以降

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{NSString *strAppend = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([strAppend length] > 0) {
    [self.currentAttribute appendString:string];
}

}

どんな助けでも大歓迎です。前もって感謝します

4

2 に答える 2

1

プロパティが保持されている場合は、次のようになります。

@property (nonatomic, retain) NSXMLParser * parser;

...その後、2回保持されます。したがって、1つのリリースではそれができません。次のように設定できます。

NSXMLParser *tempParser = [[NSXMLParser alloc] initWithData:xml];
self.parser = tempParser;
[tempParser release];

次に、self.parserを使用して必要なことをすべて実行します。次に、deallocメソッドで、それを解放します。この方法では、保持カウントが1のままになるため(元の割り当て保持はtempParserでリリースされています)、1回のリリースで次のようになります。

- (void) dealloc {
[parser release];
[super dealloc];
}

また、それぞれの可能性が同じ結果になる場合、なぜif-elseステートメントを書くのに苦労するのか私は困惑しています。

于 2011-03-05T07:00:10.610 に答える
0

どうもありがとうございましたが、オブジェクトクラス内でdealloc関数を呼び出していませんでした。この関数を追加し、[self.mystringrelease]を使用してすべての文字列を解放すると問題が解決しました

于 2011-07-08T14:34:19.880 に答える