2012年1月29日日曜日

既存のものと同名のネームスペースを addNamespace すると、Snow Leopard 環境で Segmentation fault になる

NSXMLElementaddNamespace メソッドにおいて、レシーヴァがすでに同名のネームスペースを持っている場合、かつ Snow Leopard な環境で実行すると Segmentation fault で落ちる。

 以下のような HTML があるとする。 html 要素に epub という名前のネームスペースを持っている。

 次に、この HTML を読み込んで処理を行う以下のようなコードがあるとする。 test.html にはすでに epub というネームスペースを持っているが、そこにさらに同名のネームスペースを追加する処理を行う。このコードは Lion では正常に動作するが、Snow Leopard で実行すると addNamespace: の部分で Segmentation fault で落ちる。

 addNamespace: のドキュメントによると、
If the receiver already has a namespace with the same name, aNamespace is not added.
とのことで「レシーヴァがすでに同名のものを持っている場合はネームスペースは追加されない」、つまり何もしないということだと思うんだが、そして Lion ではそのようになっているんだが、Snow Leopard では Segmentation fault で落ちる。うーん……。

 したがって、Snow Leopard で実行される場合は addNamespace: する前に同名のネームスペースがあるかどうかをチェックしておく必要がある。ある名前を持つネームスペースがあるかどうかは namespaceForPrefix: メソッドで調べることができる。

0 comments:

コメントを投稿