我一直致力于一个使用 libxml2 HTMLParser 模块在 iOS 上解析网页 HTML 的项目。每当我尝试解析包含以下行的网页时,都会从 libxml2 的 htmlParseDocument 收到 EXC_BAD_ACCESS 错误:
<?xml version="1.0" encoding="UTF-8"?>
如果我从 HTML 中删除这一行,解析工作完美。
另请注意,我正在使用 DTHTMLParser 类将 libxml2 SAX 回调绑定(bind)到 Objective-C 代码。
由于 htmlParseDocument 中的 EXC_BAD_ACCESS 没有太多内容可以继续,我构建了一个重现错误的示例 Xcode 项目。我在针对 iOS 5.1 的 Mountain Lion 上的 Xcode 4.4 中实现了它。首先它解析一个不包含违规行的 HTML 文件,然后它尝试解析包含违规行的文档并崩溃。您可以在这里下载:http://michaelmanesh.com/code/libxml2-crash.zip
最佳答案
DTHTMLParser 中的问题显然是在 libxml 中准备 c-callbacks 的方法没有将函数指针设置为在遇到处理指令时要调用的函数为 NULL。因此,处理指令导致 libxml2 尝试在某个随机地址调用函数,从而导致 EXC_BAD_ACCESS。
我解决了 DTHTMLParser 中的问题,方法是实现对在遇到处理指令时要调用的可选委托(delegate)方法的支持,如果委托(delegate)中未实现,则在处理程序结构中为 NULL。
关于objective-c - iOS 上的 libxml2 在使用 HTMLParser 解析 HTML 时导致 EXC_BAD_ACCESS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11875853/