一、背景
主要原因是自定義的HTML"tag-soup"解析器,只是簡單的將輸入分為『標(biāo)簽』和『非標(biāo)簽』兩個(gè)類別,然后從這團(tuán)亂麻中提取元數(shù)據(jù)。
二、HTML掃描器
HTML解析器最重要的操作就是便利源文件中的每個(gè)字符,并確定他屬于標(biāo)簽還是之外的文本,將<b>粗體文本</b>這個(gè)HTML源代碼切分成開口標(biāo)簽<b>、粗體文本內(nèi)容、閉口標(biāo)簽</b>。
三、將回調(diào)映射為消息
將回調(diào)函數(shù)作為函數(shù)指針傳遞給掃描器,實(shí)際上已經(jīng)非常接近于提供消息接口了,然而這會(huì)讓接口變得非常復(fù)雜。
MPWSubData的一個(gè)微妙之處在于工作原理很像NSData,但實(shí)際上它是NSString的子類,所以兼容NSString,這僅適用于字節(jié)和字符之間具有1:1映射的字符串編碼(例如ASCII或ISOLatin1,ASCII是UTF-8的一個(gè)子集),因此解析器要檢測片段是否為純ASCII,如果是則使用MPWSubData,否則創(chuàng)建一個(gè)簡單的NSString。
MPWSubData對(duì)象使用緩沖區(qū)來進(jìn)行初始化,而該緩存區(qū)引用了一個(gè)NSData對(duì)象,以及數(shù)據(jù)中對(duì)應(yīng)區(qū)域的位置和長度,他將引用的NSData對(duì)象進(jìn)行了retain操作,因此不會(huì)釋放掉底層的緩存區(qū)。由于通常情況下,會(huì)多次使用相同的緩存區(qū),因此要正確的設(shè)置緩存區(qū),避免不必要的引用計(jì)數(shù)操作,從而達(dá)到優(yōu)化目的,否則會(huì)嚴(yán)重影響總體性能。