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];

您泄漏了存储在这些 ivars 中的先前值。

于 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

如果您确定此代码段中存在泄漏,我假设您已经运行了 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…
 }
于 2012-04-26T09:03:51.980 回答