【问题标题】:Where the Memory is Leaking because showing leakage内存泄漏的地方,因为显示泄漏
【发布时间】:2012-06-20 04:34:14
【问题描述】:

在我的代码中显示 2 处内存泄漏,请参阅并帮助我。

1.FIRST

UIButton *push = (UIButton *)sender;
NSString *string = [NSString stringWithFormat:@"%@",[push currentTitle]];
NSArray *chunks = [[NSArray alloc]initWithArray:[stringcomponentsSeparatedByString:@"-"]];
list = [[NSMutableArray alloc]initWithArray:chunks];
(NSMutableArray *list;)
[chunks release];

2.秒

这里首先是源代码

NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSURL *url = [[NSURL alloc]initWithString:@"http://www/absdf.com/myXML.xml"];
self.parser = [[NSXMLParser alloc]initWithContentsOfURL:url];
[parser setDelegate:self];
[parser parse];
[parser release];
[url release];
[pool drain];

当我正在执行此代码并使用此 Instruments Tools 的行号:2 显示内存泄漏和最重的回溯。 所以请告知原因。?

【问题讨论】:

    标签: objective-c ios cocoa-touch instruments


    【解决方案1】:

    除了其他答案之外,您的池应该被释放

    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    
    //... then
    [pool release];
    

    【讨论】:

    • @Bunts 每当你使用“new”时,你也应该使用“release”
    • 但我使用了排水管,这就是为什么会出现这个问题
    • 使用 release 而不是 drain 看看这是否解决了那部分问题
    • 非常感谢.....解决了。请你能描述一下排水和释放之间的区别吗?
    • Drain 将耗尽池,但它不会释放池对象本身,池对象会泄漏其引用,而是释放将释放并耗尽池,请考虑投票和/或接受答案如果有帮助:)
    【解决方案2】:

    显然,list = [[NSMutableArray alloc]initWithArray:chunks]; 永远不会被释放。

    【讨论】:

    • 但我释放它 ViewDidUnload like self.list = nil;并在 -(void)dealloc 中,如 [list release];
    【解决方案3】:
    self.parser = [[NSXMLParser alloc]initWithContentsOfURL:url];
    

    alloc/init 返回一个retained 对象,如果你的parser 属性是用retain 属性声明的,那么你就保留了它。应该是:

     self.parser = [[[NSXMLParser alloc]initWithContentsOfURL:url] autorelease];
    

    附:确保您对 list 实例变量进行了适当的内存管理。只是为了确保您更好地使用属性。

    【讨论】:

    • alloc/init 不返回自动释放的对象。它返回一个 releaseCount = 1 的对象。
    • ups.. 你说得对,我认为它应该是自动发布的:P
    • 我从未在 NSXMLParser 中使用过属性。仅在单个函数中创建并使用它。
    【解决方案4】:
    1. 列表应该在某个地方发布,也许在 dealloc 中

      - (void)dealloc {
         [list release];
         [super dealloc];
      }
      
    2. parser = [[NSXMLParser alloc]initWithContentsOfURL:url];

    NSXMLParser *tempParser = [[NSXMLParser alloc]initWithContentsOfURL:url];
    self.parser = tempParser;
    [tempParser release];
    

    【讨论】:

    • 我只使用了 tempParser,还有另一个解析器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多