if ([elementName isEqualToString:@"type"])
{
items = [[NSMutableDictionary alloc] init];
currentname = [[NSMutableString alloc] init];
currentid = [[NSMutableString alloc] init];
}
如何RESOLV泄漏问题这里的泄漏在哪里?
if ([elementName isEqualToString:@"type"])
{
items = [[NSMutableDictionary alloc] init];
currentname = [[NSMutableString alloc] init];
currentid = [[NSMutableString alloc] init];
}
如何RESOLV泄漏问题这里的泄漏在哪里?
currentElement = [elementName copy];
items = [[NSMutableDictionary alloc] init];
currentname = [[NSMutableString alloc] init];
currentid = [[NSMutableString alloc] init];
你泄露存储在这些实例变量之前的值。
是的,我做所有新值的剪辑,我从一个xml数据文件中读到,为什么我粉碎了旧的valerus – 2012-04-26 09:16:31
@ B.Moahmmed.Amine对于旧的价值观,你不能放过......你是负责任的自创建它们之后释放它们。 – Hailei 2012-04-26 09:23:05
如果您确定此代码段中存在泄漏,我假设您已经运行了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…
}
我写了[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
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中的“分析”功能是您的朋友。
试过运行XCode的静态分析器?什么症状?试过使用仪器? – Romain 2012-04-26 08:45:26
您可能需要提供更多的上下文才能获得有意义的答案。这些iVar是在类中还是这些方法/函数的局部变量?事后做什么? – FelixLam 2012-05-03 08:23:22