[解決済み] Swift ネイティブベースクラスまたは NSObject
質問
私はいくつかの のスウィズリング を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 {
}
関連
-
[解決済み] dispatch_after - GCD in Swift?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] Swiftでindexとelementでループを反復させる方法
-
[解決済み] Swiftの@selector()?
-
[解決済み] iOSのBackground Threadの起動
-
[解決済み] キューに入れられたperformSelector:afterDelayの呼び出しをキャンセルする
-
[解決済み] IOSのUIViewからアプリケーションのドキュメントフォルダに画像を保存する
-
[解決済み] AppDelegateからストーリーボード上の異なる場所で条件付きで開始する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Objective-Cで配列に結合する
-
[解決済み] Xcodeはクラッシュの原因となる行を表示しない
-
[解決済み] インスタンスメッセージの受信型'CALayer'は前方宣言である」とはどういう意味か?
-
[解決済み] switch文の中で変数を宣言する [重複]。
-
[解決済み] performSelectorの使用: メソッドを呼び出すだけと比較した場合
-
[解決済み] Objective-Cでオブジェクトをコピーする方法
-
[解決済み] 「アプリケーションはアクティブなコントローラを表示しようとした」?
-
[解決済み] idの意味は?
-
[解決済み] AppDelegateからストーリーボード上の異なる場所で条件付きで開始する。
-
[解決済み] Objective-Cです。NSNotificationのオブザーバを削除するには?