xcodeでlldbコマンド

XCodeのデバッガのコンソールではログの表示だけではなくlldbのコマンドが使える。

以下の3つのコマンドを覚えるだけで便利に使える。

コマンド
コマンド 引数 機能
s   ステップ実行
c   実行を継続
po オブジェクト(式)の評価

poコマンドは多機能で式の評価と言いつつ以下の様に、値の表示、メソッドの実行、変数に代入の機能がある。

  • id型を見る
(lldb) po self.window
(NSWindow *) $7 = 0x000000010230d2c0 <NSWindow: 0x10230d2c0>
  • メソッドの実行
(lldb) po [self openPanel:nil]
<no result>
(lldb) c
  • 変数に代入
(lldb) po theEvents = nil
(SCEvents *) $2 = 0x0000000000000000 <nil>

フォルダを読み込む為のCFBundleDocumentTypesの設定

NSDocumentControllerでfolderを受け付ける為に、info.plistの設定を行った。 フォルダータイプを受け付ける為に、CFBundleDocumentTypesの項目に以下の項目を追加した。

追加項目
キー 説明
CFBundleTypeExtensions 任意の拡張子を表す
CFBundleTypeOSTypes fold OS9でフォルダーを示すOSType

しかし、今資料を見たら、これらの設定が”Deprecated”との事。 今のところ動作には問題はないようだが、”Deprecated”な物を使うのは気持ちが悪いので変更する。

単純に書くと

  1. CFBundleTypeExtensionsとCFBundleTypeOSTypesを削除
  2. LSItemContentTypesとLSHandlerRankを追加

で終わり。 詳しく書くと、

変更前のinfo.plistは以下

../../../_images/before_infoplist.tiff

ターゲットのinfoタブでは以下

../../../_images/before_infotab.tiff

両方とも同じinfo.plistファイルの内容を反映して表示しています。

変更後のinfo.plistは以下

../../../_images/after_infoplist.tiff

ターゲットのinfoタブでは以下

../../../_images/after_infotab.tiff

CFBundleTypeExtensionsとCFBundleTypeOSTypesを削除し、LSItemContentTypesとLSHandlerRankを追加した。

追加項目
キー 説明
LSItemContentTypes public.folder フォルダーを表すUTI
LSHandlerRank none  

扱うファイルがLSHandlerRankの値は、扱うファイルがフォルダーの為にnoneとした。

参考文献

iOSアプリケーションを特定のファイル形式に対応させる方法について :
http://safx-dev.blogspot.jp/2010/11/ios_21.html
UTI一覧 : System-Declared Uniform Type Identifiers
http://developer.apple.com/library/mac/#documentation/Miscellaneous/Reference/UTIRef/Introduction/Introduction.html
Info.plist用のキー一覧 : information Property list key Refarence
http://developer.apple.com/library/ios/#documentation/general/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html

man ditzが出ない

私の環境では以下のようにして出せる。

こんな所にもmanのパスを通す物なのだろうか? それともrubyのgemと言う物に何か設定をしなければイケナイのかもしれない。

$ man /Library/Ruby/Gems/1.8/gems/ditz-0.5/man/ditz.1

CocoaでYAML

はじめに

MacOSX上のCocoaでYAMLを読み込む必要が出て来た。 そこでgoogle先生に伺った所、何種類かライブラリが出て来た。トップ表示されていたSyckライブラリを使う事にした。

SyckにはCocoa用ラッパーのフレームワークが入っており、コレをビルド出来ればCocoaから簡単に使う事が出来る。

この文書はその時のビルド方法のメモです。なお、iOS上での動作確認はしてません。

開発環境

開発環境は以下の通りです

MacOSX:10.8.2
XCode:4.5.2
Syck:0.7(commit 2656dcc9e879a26e0d7c36ae45f22150d2692ad0)

ビルド方法

https://github.com/indeyets/syck”から圧縮ファイルをダウンロード解凍する

そのままbootstrapファイルを実行するとエラーになるので一部修正する。 理由は”libtoolize”が見つからないため。

私の環境では”/opt/local/bin/glibtoolize”にMacPortsで入れていたのでlibtoolizeの代わりにglibtoolizeを使うよう以下のように変更した。

#! /bin/sh

set -x
aclocal
autoheader
autoconf
# libtoolizeをglibtoolizeに変更
glibtoolize
automake --foreign --add-missing --copy

この変更を行えばlibsyck.aの生成まで以下のコマンドで行えます。

$ cd 解凍後のディレクトリへのパス
$ ./bootstrap
$ ./configure
$ make

その後、./ext/cocoaにあるYAML.xcodeprojの変更を行う。 修正箇所は3カ所。

  1. “YAML_Prefix.pch”をResourcesフォルダーにコピーしないようにする

おそらく何らかの操作ミスで、コピーする項目に入ってしまったのだろう。以下の図の様にコピー対象から外す。

../../../_images/yaml-PCH-before.tiff

外すとこうなります。

../../../_images/yaml-PCH-after.tiff
  1. Info.plsitの”Bundle ID”を修正する。

“Bundle ID”がプロジェクト作成時の初期設定のままの”com.apple.yourcocoaframework”なので変更する。 ここで、IDは制作者に敬意を払い、”net.thimbleby.will.yaml.in.cocoa”とする。

元の設定が以下のようになっているのを

../../../_images/yaml-InfoPlist-before.tiff

この様に変更する。

../../../_images/yaml-InfoPlist-after.tiff
  1. GSNSDataExtensions.mで配列の容量が足らない気がするので追加

これは非常に簡単。

file:ext/cocoa/src/Base64 NSData code/GSNSDataExtensions.m
line:200

の配列outbufの長さをを3から4に変えただけ。

unsigned char         inbuf [4], outbuf [3];

unsigned char         inbuf [4], outbuf [4];

に変えた。

アドレスを他にも、32bitから64bitへ移行したので、NSLogやprintfの%dを%ldに変える必要があるらしいが、詳しい事が判らないのでパス。

最後にビルドする。ここではDeploymentビルドを手軽にコピーしたいのでxcodebuild経由でビルドしています。

$ xcodebuild -configuration Deployment -sdk macosx10.8

これで”ext/cocoa/build/Deployment”にYAML.frameworkが出来ます。

../../../_images/yaml-framework.tiff

参考文献

Cocoa Wapperを書いた人のサイト http://will.thimbleby.net/yaml-in-cocoa/

多分Syckの公式サイト https://github.com/indeyets/syck