17

このリファレンスから:

新しいオブジェクトが作成されると、そのオブジェクトのメモリが割り当てられ、そのインスタンス変数が初期化されます。オブジェクトの変数の最初は、そのクラス構造へのポインターです。isaと呼ばれるこのポインタは、オブジェクトにそのクラスへのアクセスを提供し、クラスを介して、継承元のすべてのクラスへのアクセスを提供します。

これこれを読んで理解できたことから、イントロスペクションを使用することができますが、実用的な方法(iOS開発)で、プログラマーはこの特別なポインターを知っている/理解することから何を得ることができますか?

4

4 に答える 4

22

本当の利点は、Objective-Cランタイムをよりよく理解することです。これは、C++のような静的言語と比較して実際には非常に複雑です。ポインタはisa、実際には、ランタイムをハッキングして特別なことをしない限り、それほど多くは使用されません。このガイドには、ランタイムでの使用方法に関する詳細が記載されています。

isa本番コードで直接使用するべきではありません。それは次のようなものretainCountです-それを理解することは重要ですが、決してそれを呼ぶべきではありません。

于 2012-06-12T14:43:32.350 に答える
5

64ビット環境では、オブジェクトのISAフィールドにアクセスしないでください。ISAフィールドはポインタを保持しなくなりました。いくつかのポインタデータが含まれ、残りのビットを使用して他のランタイム情報を保持します。CLASSプロパティまたはOBJECT_GETCLASS関数を使用して、isaフィールドを読み取ることができます。OBJECT_SETCLASSを使用して、isaフィールドを書き込むことができます。

参照: https ://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html#//apple_ref/doc/uid/TP40013501-CH3-SW1

于 2015-04-08T13:49:02.483 に答える
5

実行時に、メッセージがオブジェクトに送信されると、そのオブジェクトはそれを作成したクラスに移動し、「このメッセージが送信されました。一致するメソッドのコードを実行してください」と言います。これは、実行するメソッドがコンパイル時に決定されるほとんどのコンパイル言語とは異なります。


オブジェクトはどのクラスがそれを作成したかをどのように知っていますか?

isaポインタを使用します。すべてのオブジェクトには、isaというインスタンス変数があります。オブジェクトが作成されると、クラスは戻りオブジェクトのisaインスタンス変数をそのクラスを指すように設定します。オブジェクトがそのクラスの「インスタンス」であるため、これはisaポインタと呼ばれます。おそらくisaポインターを明示的に使用することは決してないでしょうが、その存在はObjective-Cにその力の多くを与えます。


オブジェクトは、そのクラス(isaポインターが指す)が関連するメソッドを実装している場合にのみメッセージに応答します。これは実行時に発生するため、XCodeはコンパイル時(アプリケーションのビルド時)にオブジェクトがメッセージに応答するかどうかを常に把握できるとは限りません。XCodeは、応答しないオブジェクトにメッセージを送信していると判断した場合はエラーを表示しますが、不明な場合はアプリケーションをビルドします。


何らかの理由で(そして多くの可能性がありますが)、応答しないオブジェクトにメッセージを送信することになった場合、アプリケーションは例外をスローします。したがって、isaポインタがランタイムエラーの理由です。ここで詳細と例を確認しましょう:IOS-Objective-C-例外と認識されないセレクター

于 2016-01-23T18:05:44.310 に答える
3

isaはクラスオブジェクトを指すので、これは機能します

if(self->isa == [self class])
    NSLog(@"True");

これの使用方法を理解すると、作成されたオブジェクトのクラスオブジェクトのイントロスペクションやテストなど、いくつかの利点があります。

于 2012-06-12T14:43:07.433 に答える