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];
您泄漏了存储在这些 ivars 中的先前值。
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 中的“分析”功能都是您的朋友。
如果您确定此代码段中存在泄漏,我假设您已经运行了 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…
}