« Delphiで正規表現(Onigumo) | トップページ | Delphiでスレッド »

2013年12月 1日 (日)

DelphiでObjective-Cのブロック

まず、最初に正規表現パックの方をちょっと更新しておきましたdashdash


更新内容はDelphiで正規表現(NSRegularExpression)で書きましたが、Delphiの文字列からNSStringオブジェクトを作成する時に、NSStringクラスのstringWithCharacters:length:クラスメソッドなどで作成すると、Delphiの文字列がコピーされる事になると思うのですが、文字列が巨大になるとオーバーヘッドになると思うので、コピーが発生しないinitWithCharactersNoCopy:length:freeWhenDone:インスタンスメソッドを使ってDelphi側とメモリを共有するようにしました(まぁ、これを気にするのは、テキストエディタとか作る時ぐらいだろうし、どうでもいいな・・・)。

ということで、タイトルのObjective-Cのブロック についてです。ブロックというのは、他の言語ではクロージャーとか呼ばれたりするものらしいですが、詳しくは、各自調べて下さいdashdash。ここでは、このブロックを引数に取るObjective-CのメソッドをDelphi側からどう呼ぶのか調べました。

例として、NSRegularExpressionクラスのenumerateMatchesInString:options:range:usingBlock:インスタンスメソッドを見てみます。

最初見た時、面食らいましたが、第4引数がブロックです。で、Delphi-ObjectiveCブリッジのソースコード(Macapi.ObjectiveC.pas)を読むかぎり、Objective-Cのブロックは、Delphi側ではメソッドポインタ型として宣言すればいいようです。ということで、上記の例をDelphi側にインポートすると、


こんな感じでしょうか。簡単ですねup。ただし、更にソースを追っていくと、Macapi.OCBlocks.pasにGetObjCBlockという関数があるのですが、この実装を見ると、

OSXプラットフォームでは空になります。ということで、Delphi XE4では、iOSプラットフォームでは呼べるようですが、OSXプラットフォームではブロックを引数に取るメソッドを簡単に呼べません。ぬぅぅぅぅ weep

注意:ソースコードをちょっと読んで勝手に判断したので、間違ってるかもしれませんsweat02

というか、自分で思ってたが、中身薄いブログばっか書いてるな・・・

« Delphiで正規表現(Onigumo) | トップページ | Delphiでスレッド »

Delphi」カテゴリの記事

iOS」カテゴリの記事

MacOS X」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1497665/54109307

この記事へのトラックバック一覧です: DelphiでObjective-Cのブロック:

« Delphiで正規表現(Onigumo) | トップページ | Delphiでスレッド »

自作ソフトウェア

無料ブログはココログ

メモ