2012-04-26 51 views
0
if ([elementName isEqualToString:@"type"]) 
    { 
     items  = [[NSMutableDictionary alloc] init]; 
     currentname = [[NSMutableString alloc] init]; 
     currentid = [[NSMutableString alloc] init]; 
    } 

如何RESOLV泄漏问题这里的泄漏在哪里?

+2

试过运行XCode的静态分析器?什么症状?试过使用仪器? – Romain 2012-04-26 08:45:26

+0

您可能需要提供更多的上下文才能获得有意义的答案。这些iVar是在类中还是这些方法/函数的局部变量?事后做什么? – FelixLam 2012-05-03 08:23:22

回答

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

你泄露存储在这些实例变量之前的值。

+0

是的,我做所有新值的剪辑,我从一个xml数据文件中读到,为什么我粉碎了旧的valerus – 2012-04-26 09:16:31

+0

@ B.Moahmmed.Amine对于旧的价值观,你不能放过......你是负责任的自创建它们之后释放它们。 – Hailei 2012-04-26 09:23:05

0

如果您确定此代码段中存在泄漏,我假设您已经运行了Instruments,它告诉您NSString对象“elementName”正在泄漏。

罗曼是正确的:一个好的一步是运行Xcode静态分析器。它可能会告诉你,[elementName copy]返回保留计数为+1的对象。 (按可可惯例,所有“复制”选择器将返回对象的所有权转移给您的代码)。

所以这里的解决方案是通过释放复制的对象来平衡 “复制” 电话时,你不需要它,使用:

- (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… 
} 
+0

我写了[currentElement release];但同样的问题。我认为我的问题在这里 - (void)parseXMLFileAtURL:(NSString *)URL { \t donnes = [[NSMutableArray alloc] init]; \t xmlURL = [NSURL URLWithString:URL]; \t xmlparser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; \t [xmlparser setDelegate:self]; \t [xmlparser setShouldProcessNamespaces:NO]; \t [xmlparser setShouldReportNamespacePrefixes:NO]; \t [xmlparser setShouldResolveExternalEntities:NO]; \t [xmlparser parse]; \t } – 2012-04-26 09:20:23

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

B当您想检查内存问题时,Xcode和Instruments中的“分析”功能是您的朋友。