1. ホーム
  2. objective-c

[解決済み] Swift ネイティブベースクラスまたは NSObject

2022-11-30 12:28:49

質問

私はいくつかの のスウィズリング をSwiftでテストして、NSObjectが(直接またはさらに上の)スーパークラスであるとき、または '@objc' の装飾を使うことによってのみ動作することを発見しました。それ以外の場合は、C++ のような静的および vtable-dispatch スタイルに従います。

Cocoa/NSObjectベースクラスなしでSwiftクラスを定義するのは普通でしょうか?もしそうなら、私はこれがメソッドインターセプションとランタイムイントロスペクションのようなObjective-Cのダイナミズムの多くを見送ることを意味することを懸念しています。

動的な実行時の動作は、プロパティ オブザーバーや Core Data のような機能の中心に位置しています。 アスペクト指向プログラミング , 高次メッセージング 分析・ロギングフレームワークなどです。

Objective-C のメソッド呼び出しのスタイルを使用すると、メソッド呼び出しに約 20 のマシン コード オペランドが追加されるため、特定の状況下で ( 小さなボディを持つメソッドへの多くのタイトな呼び出し ) C++ スタイルの静的および vtable ディスパッチでは、より良いパフォーマンスを得ることができます。

しかし、一般的な95-5ルール( 95% のパフォーマンス向上はコードの 5% をチューニングすることでもたらされます。 を考えると、強力な動的機能から始めて、必要な部分を強化することは理にかなっているのではないでしょうか?

どのように解決するのですか?

NSObjectのサブクラスであるSwiftのクラス。

  • はObjective-Cのクラスそのものです。
  • 使用する objc_msgSend() メソッドの呼び出しに使用します。
  • (ほとんどの) メソッド実装に対して Objective-C ランタイムメタデータを提供する。

NSObjectのサブクラスでないSwiftクラス。

  • は Objective-C のクラスですが、NSObject との互換性のためにほんの少しのメソッドしか実装していません。
  • は使用しません。 objc_msgSend() を使用しません (デフォルト)。
  • メソッド実装に Objective-C ランタイムメタデータを提供しない (デフォルト)

Swift で NSObject をサブクラス化すると、Objective-C の実行時の柔軟性が得られますが、Objective-C のパフォーマンスも得られます。Objective-C の柔軟性を必要としない場合、NSObject を回避することで、パフォーマンスを向上させることができます。

編集してください。

Xcode 6 beta 6で、dynamic属性が登場しました。これは、メソッドが動的なディスパッチを使用する必要があり、したがってインターセプトをサポートすることをSwiftに指示することができます。

public dynamic func foobar() -> AnyObject {
}