Objects in memory
CFRuntimeClass
CF*オブジェクトはCoreFoundationから来ており、CFString
、CFNumber
、CFAllocatior
などの50以上のオブジェクトクラスを提供しています。
これらのクラスはすべてCFRuntimeClass
クラスのインスタンスであり、呼び出されると__CFRuntimeClassTable
へのインデックスを返します。CFRuntimeClassはCFRuntime.hで定義されています。
Objective-C
使用されるメモリセクション
ObjectiveCランタイムによって使用されるデータのほとんどは実行中に変化するため、メモリ内の**__DATA**セグメントからいくつかのセクションを使用します:
__objc_msgrefs
(message_ref_t
): メッセージの参照__objc_ivar
(ivar
): インスタンス変数__objc_data
(...
): ミュータブルデータ__objc_classrefs
(Class
): クラスの参照__objc_superrefs
(Class
): 親クラスの参照__objc_protorefs
(protocol_t *
): プロトコルの参照__objc_selrefs
(SEL
): セレクタの参照__objc_const
(...
): クラスのr/o
データおよびその他の(おそらく)定数データ__objc_imageinfo
(version, flags
): イメージの読み込み中に使用されます: 現在のバージョンは0
です。フラグは事前に最適化されたGCサポートなどを指定します。__objc_protolist
(protocol_t *
): プロトコルリスト__objc_nlcatlist
(category_t
): このバイナリで定義されたNon-Lazyカテゴリへのポインタ__objc_catlist
** (category_t
): このバイナリで定義されたカテゴリへのポインタ__objc_nlclslist
(classref_t
): このバイナリで定義されたNon-Lazy Objective-Cクラスへのポインタ__objc_classlist
(classref_t
): このバイナリで定義されたすべてのObjective-Cクラスへのポインタ
また、定数値を格納するために**__TEXT
**セグメント内のいくつかのセクションを使用します:
__objc_methname
(C-String): メソッド名__objc_classname
(C-String): クラス名__objc_methtype
(C-String): メソッドの型
型エンコーディング
Objective-Cは、単純および複雑な型のセレクターおよび変数の型をエンコードするためにいくつかのマングリングを使用します:
プリミティブ型は、型の最初の文字を使用します。たとえば、
int
の場合はi
、char
の場合はc
、long
の場合はl
... そして、符号なしの場合は大文字を使用します(unsigned Long
の場合はL
)。他のデータ型で使用される文字や特殊な文字を使用する場合は、
q
はlong long
、b
はビットフィールド
、B
はブール値
、#
はクラス
、@
はid
、*
はcharポインタ
、^
は一般的なポインタ
、?
は未定義
です。配列、構造体、および共用体は、
[
,{
,(
を使用します。
メソッド宣言の例
セレクタは processString:withOptions:andError:
になります。
タイプエンコーディング
id
は@
とエンコードされますchar *
は*
とエンコードされます
メソッドの完全なタイプエンコーディングは:
詳細な分析
戻り値の型 (
NSString *
):@
としてエンコードされ、長さ 24 で表されるself
(オブジェクトインスタンス):@
としてエンコードされ、オフセット 0 に位置する_cmd
(セレクタ)::
としてエンコードされ、オフセット 8 に位置する最初の引数 (
char * input
):*
としてエンコードされ、オフセット 16 に位置する二番目の引数 (
NSDictionary * options
):@
としてエンコードされ、オフセット 20 に位置する三番目の引数 (
NSError ** error
):^@
としてエンコードされ、オフセット 24 に位置する
セレクタとエンコーディングを組み合わせることで、メソッドを再構築できます。
クラス
Objective-Cにおけるクラスは、プロパティ、メソッドポインタなどを持つ構造体です。ソースコード内で objc_class
構造体を見つけることができます。
このクラスは、isaフィールドの一部ビットを使用してクラスに関する情報を示します。
その後、構造体には、クラスの名前、基本メソッド、プロパティ、インスタンス変数などの属性を含むディスク上に保存された構造体class_ro_t
へのポインタがあります。
ランタイム中には、メソッド、プロトコル、プロパティなどを変更できるポインタを含む追加の構造体class_rw_t
が使用されます。
Last updated