我试图找出为什么我的应用程序崩溃(RSS读取器),如果我发送一个错误的URL到NSXML解析器。我得到了一个EXC_BAD_ACCESs。所以经过一些搜索,我发现我必须使用僵尸。因此,我向环境添加了以下参数:

CFZombieLevel = 3
NSMallocStaclLogging = YES
NSDeallocateZombies = NO
MallocStackLoggingNoCompact = YES
NSZombieEnabled = YES
NSDebugEnabled = YES
NSAutoreleaseFreedObjectCheckEnabled = YES

我还添加了malloc_error_break作为断点。然后我在gui中添加了一些其他断点,并按下build和debug。在控制台中,我收到以下消息:
2010-08-28 18:41:49.761 RssReader[2850:207] *** -[XMLParser respondsToSelector:]: message sent to deallocated instance 0x59708e0
有时我也会得到以下信息:
wait_fences: failed to receive reply: 10004003
如果我键入“shell malloc_history 2850 0x59708e0”,则会得到以下结果:
...
ALLOC 0x5970870-0x59709d7 [size=360]: thread_a0aaa500 |start | main | UIApplicationMain | -[UIApplication _run] | CFRunLoopRunInMode | CFRunLoopRunSpecific | __CFRunLoopRun | __CFRunLoopDoSource1 | __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ | PurpleEventCallback | _UIApplicationHandleEvent | -[UIApplication sendEvent:] | -[UIApplication handleEvent:withNewEvent:] | -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] | -[UIApplication
...
----
FREE  0x5970870-0x59709d7 [size=360]: thread_a0aaa500 |start | main | UIApplicationMain | -[UIApplication _run] | CFRunLoopRunInMode | CFRunLoopRunSpecific | __CFRunLoopRun | __CFRunLoopDoSource1 | __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ | PurpleEventCallback | _UIApplicationHandleEvent | -[UIApplication sendEvent:] | -[UIApplication handleEvent:withNewEvent:] | -[UIApplication
...
ALLOC 0x59708e0-0x597090f [size=48]: thread_a0aaa500 |start | main | UIApplicationMain | -[UIApplication _run] | CFRunLoopRunInMode | CFRunLoopRunSpecific | __CFRunLoopRun | __CFRunLoopDoSource1 | __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ | PurpleEventCallback | _UIApplicationHandleEvent | -[UIApplication sendEvent:] | -[UIApplication handleEvent:withNewEvent:] | -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] | -[UIApplication
...
Binary Images:
    0x1000 -     0x6ff3 +RssReader ??? (???) <6EBB16BC-2BCE-CA3E-C76E-F0B078995E2D> /Users/svp/Library/Application Support/iPhone Simulator/4.0.1/Applications/AF4CE7CA-88B6-44D4-92A1-F634DE7B9072/RssReader.app/RssReader
    0xe000 -   0x1cfff3 +Foundation 751.32.0 (compatibility 300.0.0) <18F9E1F7-27C6-2B64-5B9D-BAD16EE5227A>
...

这是什么意思?如何知道0x59708e0是哪个对象?我找不到导致我的应用程序崩溃的代码。我只知道它应该是respondstoselector消息。我在所有respondstoselector消息中添加了一个断点。他们会被窃听,但应用程序不会在那时崩溃。我也试图评论他们除了一个,也得到了应用崩溃。那个没被评论出来的,没被击中。哪里有内存泄漏?
下一个令人困惑的事情是,尽管调用了parseerroroccurrence委托,nsxml解析器仍然继续其工作。错误两次后,应用程序崩溃。
为什么运行中的僵尸禁用了性能工具?
编辑:
现在我使用了这个指令(无法发布)。对不起的。垃圾邮件预防)我有这个工作。这是什么意思?
@格雷厄姆:
在我的解析器类中,我实例化了NSXMLParser
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        ...
    NSXMLParser *rssParser = [[NSXMLParser alloc] initWithData:responseData];
    [rssParser setDelegate:self];
        ...
    [rssParser parse];
    //[rssParser release];
}

在我搜索错误的过程中,我注释掉了发布方法。目前rssparser从未在parser类中发布过。
在我的RootViewController类中,我实例化了我的解析器:
- (void)loadData {
    if (newsItems == nil) {
        [activityIndicator startAnimating];

        XMLParser *rssParser = [[XMLParser alloc] init];
        [rssParser parseRssFeed:@"http://feeds2.feedburner.com/TheMdnShowtest" withDelegate:self];

        [rssParser release];
        rssParser = nil;

    } else {
        [self.tableView reloadData];
    }
}

如果我不把它放在这里,它就不会崩溃。但每一次我都要做一次释放?或者我应该在NSXMLParser中自动释放connectionDidFinishLoading

最佳答案

僵尸是禁用的,因为你使用它与内存泄漏,因为所有僵尸将作为泄漏信号。要运行僵尸工具,您可以转到Instrument菜单并执行File>New,然后单独选择僵尸工具,这样,如果僵尸收到消息,程序将停止,并且您将在弹出的小窗口中获得指向该僵尸对象及其历史的链接。

10-08 17:23