if ([elementName isEqualToString:@"type"])
{
items = [[NSMutableDictionary alloc] init];
currentname = [[NSMutableString alloc] init];
currentid = [[NSMutableString alloc] init];
}
resolv如何泄漏问题
答案 0 :(得分:2)
currentElement = [elementName copy];
items = [[NSMutableDictionary alloc] init];
currentname = [[NSMutableString alloc] init];
currentid = [[NSMutableString alloc] init];
您泄漏了存储在这些ivars中的先前值。
答案 1 :(得分: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中的“Analyze”功能都是你的朋友。
答案 2 :(得分:0)
如果您确定此代码段中存在泄漏,我假设您已经运行了Instruments,它告诉您NSString对象“elementName”正在泄漏。
Romain是对的:一个很好的步骤是运行Xcode静态分析器。它可能会告诉您[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…
}