0
if ([elementName isEqualToString:@"type"])
    {
        items       = [[NSMutableDictionary alloc] init];
        currentname = [[NSMutableString alloc] init];
        currentid   = [[NSMutableString alloc] init];
    }

リークの問題をどのように解決できますか

4

3 に答える 3

2
currentElement = [elementName copy];
items          = [[NSMutableDictionary alloc] init];
currentname    = [[NSMutableString alloc] init];
currentid      = [[NSMutableString alloc] init];

これらのivarに保存されている以前の値をリークします。

于 2012-04-26T08:57:27.980 に答える
1
  • currentElement = [elementName copy];
  • items = [[NSMutableDictionary alloc] init];
  • currentname = [[NSMutableString alloc] init];
  • currentid = [[NSMutableString alloc] init];

parser:didStartElement:namespaceURI:qualifiedName:attributes:メソッドが複数回実行されると、これらすべてがメモリリークを引き起こします。

この問題を修正する簡単な方法は、変数をプロパティに変更することです。たとえば、ヘッダーファイルで次のように変更します。

@interface SomeClass {
    NSMutableDictionary *items;
}

に:

@interface SomeClass {
}

@property (retain) NSMutableDictionary *items;

そしてこれを後に追加します@implementation SomeClass

@synthesize items;

次に、元のコードを次のように変更します。

self.items = [[[NSMutableDictionary alloc] init] autorelease];

XcodeとInstrumentsの両方の「分析」機能は、メモリの問題を確認したいときに便利です。

于 2012-04-26T09:20:08.753 に答える
0

このスニペットにリークがあることが確実にわかっている場合は、NSString オブジェクトの「elementName」がリークしていることが通知された Instruments を既に実行していると思います。

Romain の言うとおりです。Xcode Static Analyzer を実行することをお勧めします。おそらく[elementName copy]、保持カウントが +1 のオブジェクトを返すことがわかります。(Cocoa の規則により、すべての「コピー」セレクターは、返されたオブジェクトの所有権をコードに転送します)。

したがって、ここでの解決策は、コピーされたオブジェクトが必要ないときに解放することで、「コピー」呼び出しのバランスを取ることです。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{ 
     [currentElement release];
     currentElement = [elementName copy];

     // your method body here…
 }
于 2012-04-26T09:03:51.980 に答える