1

コード内の計測器でメモリ リークが発生していますここに画像の説明を入力

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

     NSMutableString * res = [[[NSMutableString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]autorelease];
     [webData release];
    [connection release];
        [res replaceOccurrencesOfString:@"&" withString:@"&" options:NSCaseInsensitiveSearch range:(NSRange){0,[res length]}];
    [delegate getcat:res];

    [pool drain];
}



- (void)getcat:(NSString*)xml
{

if (xmlParser) {

    [xmlParser release];
}
Cid = [[NSMutableArray alloc] init];
Categories = [[NSMutableArray alloc] init];

NSData *data = [xml dataUsingEncoding:NSUTF8StringEncoding];
xmlParser = [[NSXMLParser alloc] initWithData:data];

[xmlParser setDelegate:self];

[xmlParser setShouldResolveExternalEntities:YES];
[xmlParser parse];
[xmlParser release];

}

これはメモリを管理する正しい方法ですか?

4

2 に答える 2

1

実際に文字列を解放する自動解放プールを設定する代わりに、自分で解放してみませんか? デリゲートが に文字列を保持している場合は、getcat:単純に解放できます。

- (void) connectionDidFinishLoading: (NSURLConnection *) connection
{
    // Omit the autorelease pool.

    NSMutableString * res = [[NSMutableString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
    [webData release];
    [connection release];
    [res replaceOccurrencesOfString:@"&" withString:@"&" options:NSCaseInsensitiveSearch range:NSMakeRange(0, res.length)];
    [delegate getcat:res];
    [res release];
}

を見るとgetcat:、次のような問題があります。

[xmlParser parse];
[xmlParser release];

通常、オブジェクトはスレッドから結果を返すためにデリゲートを必要とします。[xmlParser parse] がスレッドを開始するとします。おそらく、終了する前にリリースしないでください。つまり、 で行いparserDidEndDocument:ます。

ただし、これは多くのリークされた文字列を説明していません。

于 2011-08-29T13:13:29.333 に答える
0

この問題を修正しました

漏れは入っています

  • (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 名前空間URI:(NSString *)namespaceURI 修飾名:(NSString *)qName 属性:(NSDictionary *)attributeDict{

    currentElement = [要素名のコピー]; --->常にこの行で漏れているしかし、漏れ計器はその行を示しています

}

コードを self.currentElemnt=elementNameに置き換えます

于 2011-09-05T09:08:26.010 に答える