« 2013年11月 | トップページ | 2014年3月 »

2013年12月

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

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

« 2013年11月 | トップページ | 2014年3月 »

自作ソフトウェア

無料ブログはココログ

メモ