RubyによるMac OS Xデスクトップアプリケーション開発入門 第9章

第9.3 取り消しとやり直しの完成?(P.142)まで進んだ。
試しに動かすと、追加と削除は動いてくれた。今回使用した

undo_manager.registerUndoWithTarget_selector_object_

は理解できなかったが。
編集の方はサブウィンドウの表示までは動くが、OKボタンを押すと止まってしまう。
ログを見ると

プログラムはシグナルを受信しました:“EXC_BAD_ACCESS”。
sharedlibrary apply-load-rules all
(gdb)

と出ている。
動いているソース部分は、

def update_entry(entry, attrs)
	old_attrs = entry.attributes
	entry.attributes = attrs
	self.selectedObjects = [entry]
	undo_manager.prepareWithInvocationTarget(self).update_entry(entry, old_attrs)
	undo_manager.ActionName = "Edit Entry"
end

となっている。
どこが悪いのか、コメントアウトしつつ動かしてみた。

	undo_manager.prepareWithInvocationTarget(self).update_entry(entry, old_attrs)

この箇所が入っていると、止まってしまうらしい。
なので、一時的に

def update_entry(entry, attrs)
	old_attrs = entry.attributes
	entry.attributes = attrs
	self.selectedObjects = [entry]
#	undo_manager.prepareWithInvocationTarget(self).update_entry(entry, old_attrs)
	undo_manager.ActionName = "Edit Entry"
end

としたら、動いてくれている。
エラーログも出力されなくなった。

ログを見てもどこが悪いのかがよく分からない。
昨夜、MacOSXを10.6.2にしたのがダメなのだろうか?

もしかして、ループみたいになってるのか?

undo_manager.prepareWithInvocationTarget(self).update_entry(entry, old_attrs)

の部分で、自分が所属しているメソッド(update_entry(entry, attrs))を呼んでたりするようにも見えるけど、undo_managerを通して呼んでるんだろうし。
言語の仕様におっついてないから、ロジックが正常に動くのかどうかさえ目で追えないとは。。