【问题标题】:Stop NSXMLParser Instance from Causing _NSAutoreleaseNoPool停止 NSXMLParser 实例导致 _NSAutoreleaseNoPool
【发布时间】:2010-05-22 19:35:03
【问题描述】:

在我的 iPhone 应用程序中,我有一个 NSXMLParser 实例,它设置为自定义委托以读取 XML。然后将其移动到自己的线程中,以便它可以在后台更新数据。但是,自从我这样做以来,它一直在控制台中给我很多 _NSAutoreleaseNoPool 警告。我试图为我的每个委托类添加一个 NSAutoreleasePool ,但是,这似乎并没有解决问题。我已经包含了我创建 NSXMLParser 的方法,以防万一出现问题。

NSURL *url = [[NSURL alloc] initWithString:@"http://www.mywebsite.com/xmlsource.xml"];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

CustomXMLParser *parser = [[CustomXMLParser alloc] init];

parser.managedObjectContext = self.managedObjectContext;

parser = [parser initXMLParser];

[xmlParser setDelegate:parser];

[NSThread detachNewThreadSelector:@selector(parse) toTarget:xmlParser withObject:nil];

如果有人有任何想法来解决这个问题,我将不胜感激。

谢谢。

【问题讨论】:

    标签: iphone xml cocoa-touch parsing


    【解决方案1】:

    在 Objective-c 中,每个线程都需要自己的 NSAutorelease 池来处理自动释放的对象。因此,在您的 parse 方法中,您需要创建(并释放)NSAutoreleasePool 对象:

    - (void)parse{
       NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
       ...
       // your method implementation
       ...
       [pool release];
    }
    

    【讨论】:

    • 最好将所有内容都包装在 @try { ... } @finally { [pool release]; } 也是,以防你遇到一些破坏线程的异常。当然,异常可能会中止您的应用,但仍然如此。
    • 感谢您的回复弗拉基米尔!但是,我在 NSXMLParser 上调用 parse - 我需要在某处覆盖它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2010-11-05
    • 1970-01-01
    • 2016-03-19
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多