BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Objective-Cがゼロランタイムコストのdirectメソッドを導入

Objective-Cがゼロランタイムコストのdirectメソッドを導入

ブックマーク

原文(投稿日:2019/11/24)へのリンク

Swiftが2014年にローンチされて以来、Objective-Cには小規模な変更のみが行われてきて、その大部分はSwiftとの互換性を改善するためのものだった。しかしプログラム言語として、決して衰退した訳ではない。Objective-Cは先頃、"direct"メソッドのサポートを新たに追加した。通常のメソッドと外見は同じようだが、Cの関数により近い動作をするものだ。

iOSアプリの開発言語の選択において、最も多くの関心を集めているのはSwiftだが、開発者の間ではObjective-Cの人気も衰えてはいない。実際に、2016年のTIOBEインデックスでSwiftがObjective-Cを初めて上回ったという事実のある一方で、2019年11月のTIOBEにおいては、10位のSwiftに対してObjective-Cが12位の位置にいるという事実もある。その間のTIOBEランキングで、この2つの言語の順位が何度も入れ替わっている点も興味深い。Q&Aフォーラムでの質問数を基準に同じような言語の採用度を測っているStack Overflowの言語ランキングでは、Objective-Cへの関心度の低下は明確に現れている。Stack Overflowの数字は、新たにiOS開発の領域に参入した開発者の関心をSwiftが集めているということに加えて、ここ数年間でObjective-Cに行われた変更の数が少なくなっていることから、具体的に説明することができる。

このようなすべての状況から、Objective-Cの新機能は多くの人々にとって少なからず驚きだった。簡単に言えば、ダイレクトメソッドとは、Objective-Cメタデータをアタッチせず、ゲッタやセッタが通常のC関数と同じような動作をするという、特別なプロパティの定義を可能にするものだ。この新機能の構文には、Objective-Cの@property構文をそのまま拡張して使用する。

@property (strong) NSArray* array;
@property (direct) NSString* directString;

directメソッドを使用することで、Objective-Cランタイムのobjc_msgSendによるメソッド解決に関わるオーバーヘッドが排除される。従ってこの新機能は、いくつかのクリティカルパスの最適化に利用できる可能性がある、とPSPDFKitのiOS開発者であるPeter Steinberger氏がTwitterで述べている。ただし、オーバーヘッドがすべてなくなる訳ではない。LLVMによるdirectメソッドの実装では、従来の標準的なObjective-Cメソッドとの互換性の維持が考慮されているからだ。具体的には、暗黙的なself_cmdの2引数はいずれも残っていて、メソッド呼び出し時に正しい値であることを保証するためのチェックがいくつか実行される。

directメソッドの使用には、いくつかの制限がある。最も重要なのは、directメソッドが使用できるのは内部的なプライベートAPIのみであって、フレームワークによって公開することはできない、という点だ。その他にも、オーバーロードしたメソッドをdirectにすることやdirectメソッドをオーバーロードすることはできない、インターフェースでdirect指定されたメソッドを具象時に非directで再宣言することはできない、プロトコルで要求するメソッドをdirectにはできない、unqualified-idをdirectメソッドに送ることはできない、といった制限がある。

クリティカルパスの最適化が期待される一方で、Objective-Cのこの新機能に対する反応は、必ずしも肯定的なものばかりではない。iOS開発者のTanner B(Twitterのハンドル)は、directメソッドがKVCやKVO、メソッド入れ替え(method swizzling)といった、基本的なObjective-Cの機能を損なう可能性を指摘している。Day Oneのアプリ開発者であるBJ Homer(Twitterのハンドル)は、Appleが改造(tweak)を難しくする目的にdirectメソッドを使用するのではないか、という懸念を述べている

objc_direct_membersアノテーションは事実上、真の意味でプライベートなメソッドをObjCで実装する手段になると思います。静的にディスパッチされるため、オーバーライドすることはできなくなります。Appleはこれを大々的に利用して、プライベートメソッドの呼び出しを不可能にするつもりなのではないでしょうか。

この懸念は、有名なiOS開発者で著作者のNick Lockwood氏によって、directメソッドがプライベートのみ可能であることを理由に、ある程度まで否定されている。

メソッド入れ替えをブロックしたり、KVOなどの機能を無効にすることで、Objective-Cの性格を根本的に変えてしまうのではないかという心配は、この事実で多少は軽減されるはずです。

AppleのシニアエンジニアであるPierre Habouzit氏も、この点を認めている。

最後に、directメソッドはすでにLLVMに組み込まれているが、Xcodeでは来年のWWDCまで使用できないと思われる点に注意が必要だ。

この記事に星をつける

おすすめ度
スタイル

BT