【问题标题】:Where is the leaks here?这里的泄漏点在哪里?
【发布时间】:2012-04-26 08:42:23
【问题描述】:
if ([elementName isEqualToString:@"type"])
    {
        items       = [[NSMutableDictionary alloc] init];
        currentname = [[NSMutableString alloc] init];
        currentid   = [[NSMutableString alloc] init];
    }

如何解决泄漏问题

【问题讨论】:

  • 试过运行 XCode 的静态分析器?有什么症状?尝试使用仪器?
  • 您可能需要提供更多上下文才能获得有意义的答案。这些 iVar 是在类中还是这些局部变量是方法/函数?之后你会做什么?

标签: iphone objective-c ios memory-management memory-leaks


【解决方案1】:
currentElement = [elementName copy];
items          = [[NSMutableDictionary alloc] init];
currentname    = [[NSMutableString alloc] init];
currentid      = [[NSMutableString alloc] init];

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

【讨论】:

  • 是的,我做了所有新值的剪辑,因为我从一个 xml 数据文件中读取了为什么我粉碎了旧的 valeus
  • @B.Moahmmed.Amine 对于旧的价值观,你不能放手......你有责任释放它们,因为你创造了它们。
【解决方案2】:
  • 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 中的“分析”功能都是您的朋友。

【讨论】:

    【解决方案3】:

    如果您确定此 sn-p 中存在泄漏,我假设您已经运行了 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…
     }
    

    【讨论】:

    • 我写过 [currentElement release];但同样的问题。我认为我的问题在这里 -(void)parseXMLFileAtURL:(NSString *)URL{ donnes = [[NSMutableArray alloc] init]; xmlURL = [NSURL URLWithString:URL]; xmlparser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; [xmlparser setDelegate:self]; [xmlparser setShouldProcessNamespaces:NO]; [xmlparser setShouldReportNamespacePrefixes:NO]; [xmlparser setShouldResolveExternalEntities:NO]; [xmlparser 解析]; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多