iphone - respondsToSelector 发送到释放的对象

标签 iphone objective-c xcode debugging nszombie

如果我向 NSXML Parser 发送错误的 URL,我会尝试找出我的应用程序崩溃(RSS 阅读器)的原因。我有一个 EXC_BAD_ACCESS。因此,经过一番搜索后,我发现我必须使用 Zombies。所以我在环境中添加了以下参数:

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

我还添加了 malloc_error_break 作为断点。然后我在 GUI 中添加了一些其他断点并按下了构建和调试。在控制台中,我收到以下消息:

2010-08-28 18:41:49.761 RssReader[2850:207] *** -[XMLParser respondsToSelector:]: 发送到释放实例 0x59708e0 的消息

有时我还会收到以下消息: wait_fences:未能收到回复: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 消息中添加了一个断点。他们受到打击,但应用程序并未在此时崩溃。我还尝试将它们注释掉,除了一个,而且还导致应用程序崩溃。没有被注释掉的那个,没有被击中。哪里有内存泄漏?

下一个令人困惑的事情是 NSXML Parser 继续它的工作,尽管调用了 parseErrorOccurred 委托(delegate)。抛出两次错误后,应用程序崩溃。

为什么 Zombies in the Run with Peformance Tool 被禁用?

编辑:

现在我使用了这个指令(无法发布。抱歉。垃圾邮件预防)我得到了这个工作。这是什么意思?

@格雷厄姆: 在我的解析器类中,我实例化了 NSXMLParser:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {  
        ... 
    NSXMLParser *rssParser = [[NSXMLParser alloc] initWithData:responseData];  
    [rssParser setDelegate:self];
        ...
    [rssParser parse];
    //[rssParser release];
}

我在查找错误的过程中,把release方法注释掉了。目前 rssParser 从未在解析器类中发布。

在我的 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];  
    }  
}

如果我不在这里发布它,它就不会崩溃。但是对于每个分配我都必须做一个释放?或者我应该在 connectionDidFinishLoading 中自动释放 NSXMLParser 吗?

最佳答案

当您将 Zombie 与 Memory Leaks 一起使用时,它会被禁用,因为所有 Zombie 都会被指示为泄漏。要运行 Zombie 工具,您可以转到 Instrument 菜单并执行 File>New 并单独选择 Zombie 工具,如果僵尸收到消息,程序将停止,您将在一个小弹出窗口中获得一个链接那个僵尸对象和它的历史

关于iphone - respondsToSelector 发送到释放的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3591740/

相关文章:

以编程方式设置 iPhone/iPad 外壳颜色

iphone - 为 webapp 缓存视频 - 坏主意?

iphone - 我可以将 NSURLCredentialStorage 与数据保护结合使用吗?

iphone - 如何从第二层向下建立 UINavigationController(不是从 Delegate/RootController 层)

iphone - 如何获得全尺寸的 UINavigationBar titleView

objective-c - 如何将信息从 Objective-c 的 View Controller 传递到 Swift Storyboard

objective-c - 在 iPhone 应用程序中动态更改 UI

ios - 正确设置 CocoaLibSpotify?

ios - 如何给带有圆角的UIView添加内阴影

ios - 如何退出在代码中初始化的 UIStoryboard