トップ    編集凍結 差分バックアップ添付複製名前変更リロードPages that link to here   新規一覧単語検索最終更新
   最終更新のRSS

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 オブジェクトを特定するために、次のいずれかの条件を満たしている必要があります。

通常、このモジュールの存在を意識する必要はありませんが、メッセージ送信のメカニズムなど RubyCocoa の動きを理解する上ではもっとも重要な部分でもあります。

Objective-C オブジェクトへメッセージを送信する仕組み

OSX::OCObjWrapper モジュールは、オブジェクトが処理できなかったメソッド呼び出しが method_missing に回ってくる仕組みを利用して、操作対象の Objective-C オブジェクトに対してメッセージを送信しています。

Ruby メソッド名から Objective-C メッセージセレクタへの変換

Ruby の世界でのメッセージ送信 (メソッド呼び出し) を Objective-C の世界でのメッセージ送信にマップするためには、Ruby のメソッド名を Objective-C のメッセージセレクタに変換する必要があります。

これが変換の基本ルールです。 例えば、メッセージセレクタ "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引数、... という順序で型を指定します。
:idCocoaオブジェクト
:classCocoaクラス
:voidvoid
:BOOLBOOL
:boolC++ の bool
:charchar
:ucharunsigned char
:intint
:uintunsigned int
:longlong
:ulongunsigned long
:longlonglong long
:ulonglongunsigned long long
:floatfloat
:doubledouble
:selector, :selSEL
:cstrchar*
NSPointNSPoint
NSSizeNSSize
NSRectNSRect
NSRangeNSRange
いまのところ、ポインタ型については変換規則が用意されていないので、引数にポインタを含むメソッドの場合には、typefmt を文字列形式で指定してやる必要があります。
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 に指定できる型
:charsigned char
:ucharunsigned char
:shortshort
:ushortunsigned short
:intint
:uintunsigned int
:longlong
:ulongunsigned long
:longlonglong long
:ulonglongunsigned long long
:floatfloat
:doubledouble
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>

                                                                                                                                                                                                                                                                                                                               
トップ    編集凍結 差分バックアップ添付複製名前変更リロードPages that link to here   新規一覧単語検索最終更新
   最終更新のRSS
Last-modified: 2010-03-25 (木) 03:16:34 (166d)