RubyCocoa リファレンス †
OSX::ObjcID クラス †
Objective-C オブジェクトのラッパー。ある一つの Objective-C オブジェクトのオーナーとなり、それを包みます。 通常、このクラスの存在を意識する必要はありません。
OSX::ObjcID クラスのインスタンスメソッド †
- OSX::ObjcID#inspect
- オブジェクトの情報を表す文字列を返します。
- OSX::ObjcID#__ocid__
- 包んでいる Objectivie-C オブジェクトの id の値を返します。
- OSX::ObjcID#__inspect__
- OSX::ObjcID#inspect と同じです。
OSX::OCObjWrapper モジュール †
Objective-C オブジェクトに対して、メッセージ送信 (メソッド呼び出し) を行う機能を実現したミックスインモジュールです。 RubyCocoa では、Cocoa オブジェクトにこのモジュールをインクルードしているために、Cocoa オブジェクトに対するメッセージ送信が可能となっています。
このモジュールをインクルードするオブジェクトは、操作の対象となる Objective-C オブジェクトを特定するために、次のいずれかの条件を満たしている必要があります。
- OSX::ObjcID クラスのインスタンスである
- OSX::ObjcID#__ocid__ と同じ仕様のメソッドを実装している
通常、このモジュールの存在を意識する必要はありませんが、メッセージ送信のメカニズムなど RubyCocoa の動きを理解する上ではもっとも重要な部分でもあります。
Objective-C オブジェクトへメッセージを送信する仕組み †
OSX::OCObjWrapper モジュールは、オブジェクトが処理できなかったメソッド呼び出しが method_missing に回ってくる仕組みを利用して、操作対象の Objective-C オブジェクトに対してメッセージを送信しています。
Ruby メソッド名から Objective-C メッセージセレクタへの変換 †
Ruby の世界でのメッセージ送信 (メソッド呼び出し) を Objective-C の世界でのメッセージ送信にマップするためには、Ruby のメソッド名を Objective-C のメッセージセレクタに変換する必要があります。
- メッセージセレクタの ':' を '_' に置き換えたものが Ruby でのメソッド名
これが変換の基本ルールです。 例えば、メッセージセレクタ "doSomething:with:with" のメッセージを送信する場合、Ruby でのメソッド名は "doSomething_with_with_" となります。
実際には、基本ルールの他に見た目をよくするため、以下に示すような表現のバリエーションが存在します。
- 末尾の '_' を省略する
- 引数の中にキーワードを混ぜる
これだけでは理解できないと思いますが、説明するのも難しいので具体例を示します。
[rcv doSomething:a with:b with:c]; // Objective-Cの場合 rcv.doSomething_with_with_(a, b, c) # 基本ルール rcv.doSomething_with_with(a, b, c) # バリエーション(1) rcv.objc_send(:doSomething, a, :with, b, :with, c) # バリエーション(2)
ただし、例外として NSData のクラスメソッド、
+ (NSData*)dataWithBytes:(const void*)buf length:(unsigned)len;
のように、バイト列とサイズを連続して引数に指定するメソッドを Ruby 側から呼び出す場合には、
NSData.dataWithBytes_length(str)
のように、1つの Ruby String でバイト列とサイズをまとめて指定します。
メソッド名接頭辞 "oc_" †
名前が "oc_" で始まるメソッドは、直接操作対象の Objective-C オブジェクトへメッセージ送信されます。 主として、Ruby 側と Objective-C 側の両方に同名のメソッドが存在する場合に使います。
メソッド名接尾辞 "?" †
名前の最後に "?" をつけて送信したメッセージは、返ってきた値が 0 であるかを調べて真偽値を返します。 これは BOOL を返すメソッド呼び出しのときに使います。
Objective-C のメソッドは真偽値を単なる数値 (0ならNO、1ならYES) で返してくるので、Ruby ではその値の意味が数値なのか真偽値なのかを判断できません。 さらに Ruby では、0 も 1 も真として扱われるので、そのまま論理値として扱うとすべて真として判断されてしまいます。 したがって、BOOL を返すメソッドを呼び出すときには "?" 接尾辞を使う必要があります。
インスタンスメソッド †
- to_s
- 操作対象の Objective-C オブジェクトの Ruby 文字列による表現を返します。
- to_a
- 操作対象の Objective-C オブジェクトの Ruby 配列による表現を返します。
- to_i
- 操作対象の Objective-C オブジェクトの整数値による表現を返します。
- to_f
- 操作対象の Objective-C オブジェクトの実数値による表現を返します。
- objc_methods
- 操作対象の Objective-C オブジェクトのメソッド名の一覧を返します。
- objc_method_type
- 操作対象の Objective-C オブジェクトのメソッドの型を返します。
- ocm_responds?(name)
- 操作対象の Objective-C オブジェクトが、引数 name で指定されたメソッドに応答可能かどうかを示す真偽値を返します。name はメッセージセレクタそのものか、基本ルールに従ったものでなければなりません。通常、このメソッドを使う必要はありません。
- ocm_send(name, ...)
- 操作対象の Objective-C オブジェクトに対して、引数 name で指定したメソッドを残りの引数とともに送信します。name はメッセージセレクタそのものか、基本ルールに従ったものでなければなりません。通常、このメソッドを使う必要はありません。
OSX::NSBehaviorAttachment モジュール †
このモジュールは、Cocoa 派生クラス内で ib_outlets をはじめとする、さまざまなユーザによる定義を宣言的に行うためのメソッドを提供します。RubyCocoa では、Cocoa クラスの生成時に OCClsWrapper モジュール経由で extend することで、すべての Cocoa クラスでこのモジュールのメソッドを利用できるようになっています。
アウトレットの定義 †
Interface Builder で扱うアウトレットを定義するには、ib_outlets を呼び出します。
def AppController < OSX::NSObject ib_outlets :messageField, :okButton end
アクションの定義 †
Interface Builder で扱うアクションは、ib_action で宣言します。
def AppController < OSX::NSObject
ib_action :buttonPushed
def buttonPushed(sender)
...
end
end
上の例は DRY ではないので、
def AppController < OSX::NSObject
ib_action :buttonPushed do |sender|
...
end
end
のようにメソッドを定義できますが、この方法ではブロック内で return を呼び出すことができないという制限があります。
Ruby メソッドの型指定 †
Objective-C から Ruby のメソッドを呼び出す場合には、引数と返値の型を指定する必要があります。
たとえば、ドキュメントモーダルシートを利用する場合、
ib_outlets :sheet
def start_sheet(window)
NSApp.objc_send(:beginSheet, @sheet,
:modalForWindow, window,
:modalDelegate, self,
:didEndSelector, :sheetDidEnd_returnCode_contextInfo,
:contextInfo, nil)
end
objc_method :sheetDidEnd_returnCode_contextInfo, 'v@:@i^v'
def sheetDidEnd_returnCode_contextInfo(sender, code, info)
...
end
このようにコールバックメソッド (sheetDidEnd_returnCode_contextInfo) を引き渡す場合があります。
このとき、Objective-C 側では sheetDidEnd_returnCode_contextInfo の引数と返値の型がわからないので、objc_method で引数と返値の型をあらかじめ登録しておく必要があります。objc_method の引数については、後述します。
クラスメソッド †
- ib_outlets(...)
- Interface Builder で扱うアウトレットを定義します。実際には attr_writer を呼び出しているだけです。 :ib_outlet の別名。
- ib_action(name)
- Interface Builder で扱うアクションメソッドを宣言します。アクションの定義をブロックとしてあたえることができます。e.g. ib_action(name) { |sender| ... }
- objc_method(name, typefmt)
Objective-C メソッドの型エンコードを指定します。 typefmt には、型エンコーディング 文字列 (例:'v@:@@i^v') か配列を指定します。
配列の場合には、[:void, :id, :int] のように返値、第1引数、第2引数、... という順序で型を指定します。いまのところ、ポインタ型については変換規則が用意されていないので、引数にポインタを含むメソッドの場合には、typefmt を文字列形式で指定してやる必要があります。:id Cocoaオブジェクト :class Cocoaクラス :void void :BOOL BOOL :bool C++ の bool :char char :uchar unsigned char :int int :uint unsigned int :long long :ulong unsigned long :longlong long long :ulonglong unsigned long long :float float :double double :selector, :sel SEL :cstr char* NSPoint NSPoint NSSize NSSize NSRect NSRect NSRange NSRange
- objc_class_method(name, typefmt)
- Objective-C クラスメソッドの型エンコードを指定します。
- objc_alias_method(new, old)
- Objective-C のメソッドの別名を作ります。
- objc_alias_class_method(new, old)
- Objective-C のクラスメソッドの別名を作ります。
Cocoa クラス †
NSObject、NSString、NSApplication などのすべての Cocoa クラスは、OSX::NSObject、OSX::NSString、OSX::NSApplication のように OSX モジュールに属する Ruby クラスとして定義されています。
Cocoa クラス自体にも Cocoa オブジェクトとして、OSX::OCObjWrapper モジュールがインクルードされています。
インクルードしているモジュール †
OSX::OCObjWrapper
Cocoa クラスのクラスメソッド †
- Cocoaクラス.__ocid__
- Cocoa クラスオブジェクトの id の値を整数で返します。
Cocoa 派生クラス †
Cocoa クラスの派生クラス。
Cocoa 派生クラスのクラスメソッド †
- Cocoa派生クラス.ib_outlets(...)
- アウトレットを宣言します。実際には attr_writer を呼んでいるだけです。
- Cocoa派生クラス.ns_outlets(...)
- ib_outlets の別名。
インスタンスメソッド接頭辞 "super_" †
オーバーライドしたメソッドに関して、スーパークラスでの実装を使いたい場合には "super_" を付けたメソッド名で呼び出すことができます。
ded drawRect(frame) super_drawRect(frame) # invoke SuperClass#drawRect end
OSX::OCException クラス †
Objective-C の世界で、Objective-C オブジェクトへのメソッド呼び出しによって、例外 NSException が発生した場合、このクラスの例外が発生します。
インスタンスメソッド †
- name
- 例外名 (NSException#name) を返します。
- reason
- 例外の理由文字列 (NSException#reason) を返します。
- userInfo
- ユーザ情報 (NSException#userInfo) を返します。
- nsexception
- NSException を返します。
OSX::NSData クラス †
NSData クラスには、Objective-C のメソッドに加え、Ruby とのデータのやりとりのためにいくつかのメソッドが追加されています。
- OSX::NSData.dataWithRubyString(str)
- Ruby の String から NSData を生成します。
- OSX::NSMutableData.dataWithRubyString(str)
- Ruby の String から NSMutableData を生成します。
OSX::NSPoint クラス †
Foundation フレームワークで定義されている構造体 NSPoint を Ruby で扱うためのクラスです。
クラスメソッド †
- new(x, y)
インスタンスメソッド †
- x
- y
- x=(val)
- y=(val)
- dup
- to_a
- 配列 [x, y] を返します。
OSX::NSSize クラス †
Foundation フレームワークで定義されている構造体 NSSize を Ruby で扱うためのクラスです。
クラスメソッド †
- new(width, height)
インスタンスメソッド †
- width
- height
- width=(val)
- height=(val)
- dup
- to_a
- 配列 [width, height] を返します。
OSX::NSRect クラス †
Foundation フレームワークで定義されている構造体 NSRect を Ruby で扱うためのクラスです。
クラスメソッド †
- new(origin, size)
- new(x, y, with, height)
インスタンスメソッド †
- origin
- size
- origin=(val)
- size=(val)
- dup
- to_a
- 配列 [[x, y], [width, height]] を返します。
OSX::NSRange クラス †
Foundation フレームワークで定義されている構造体 NSRange を Ruby で扱うためのクラスです。
クラスメソッド †
- new(range)
- new(location, length)
インスタンスメソッド †
- location
- length
- location=(val)
- length=(val)
- dup
- to_a
- 配列 [location, length] を返します。
- to_range
- Ruby の Range オブジェクトを返します。
OSX::ObjcPtr クラス †
Ruby から、C/Objective-C ポインタを扱うためのクラスです。
クラスメソッド †
- new(n)
- n バイトのメモリを確保したポインタを生成します。確保したメモリは 0 で初期化され、type には :uchar (unsigned char) が指定されたものとみなします。
- new(type, n)
type が n 個入るサイズのメモリを確保したポインタを生成します。確保したメモリは 0 で初期化されます。type に指定できる型:char signed char :uchar unsigned char :short short :ushort unsigned short :int int :uint unsigned int :long long :ulong unsigned long :longlong long long :ulonglong unsigned long long :float float :double double
- allocate_as_bool
- allocate_as_int
- allocate_as_int8
- allocate_as_int16
- allocate_as_int32
インスタンスメソッド †
- assign(val)
- ポインタに値を代入します。
- allocated_size
- ポインタが指し示す先のバッファについて、確保されたサイズを返します。
- regard_as
- encoding
- ポインタの型を Objective-C の 型エンコーディング 文字列として返します。
- bytestr(length)
- ポインタが指し示すバッファの内容を Ruby String として返します。
- bytestr_at(offset, length)
- ポインタが指し示すバッファの内容を Ruby String として返します。
- [](offset)
- [](offset, count)
- []=(offset, val)
- bool
- int
- uint
- int8
- uint8
- int16
- uint16
- int32
- uint32
- bool_at(offset)
- int_at(offset)
- uint_at(offset)
- int8_at(offset)
- uint8_at(offset)
- int16_at(offset)
- uint16_at(offset)
- int32_at(offset)
- uint32_at(offset)
原著者: 藤本尚邦, <hisa at fobj.com>