if ([elementName isEqualToString:@"type"])
{
items = [[NSMutableDictionary alloc] init];
currentname = [[NSMutableString alloc] init];
currentid = [[NSMutableString alloc] init];
}
リークの問題をどのように解決できますか
if ([elementName isEqualToString:@"type"])
{
items = [[NSMutableDictionary alloc] init];
currentname = [[NSMutableString alloc] init];
currentid = [[NSMutableString alloc] init];
}
リークの問題をどのように解決できますか
currentElement = [elementName copy];
items = [[NSMutableDictionary alloc] init];
currentname = [[NSMutableString alloc] init];
currentid = [[NSMutableString alloc] init];
これらのivarに保存されている以前の値をリークします。
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の両方の「分析」機能は、メモリの問題を確認したいときに便利です。
このスニペットにリークがあることが確実にわかっている場合は、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…
}