3

Objective-Cランタイムリファレンスによると:

ivar_getOffsetインスタンス変数のオフセットを返します。

ptrdiff_t ivar_getOffset(Ivar ivar)説明タイプidまたは他のオブジェクトタイプのインスタンス変数の場合、このオフセットを使用してインスタンス変数データに直接アクセスする代わりに、object_getIvarおよびobject_setIvarを呼び出します。

runtime.hで宣言されています

どうしてこれなの?object_getIvarはオブジェクトタイプに対して何をしますか?

編集:質問を添え字(void *)から(id *)に変更しました。

4

2 に答える 2

2

ivarの値を取得する場合、これら2つのアプローチに違いはありません。object_getIvar()これは、AppleのオープンソースObj-Cランタイムコードでの実装を確認することで確認できます。

object_setIvar()オブジェクトポインタからのオフセットに割り当てるだけではありません。objc_assign_ivar()実際の割り当てを実行するには、ガベージコレクションランタイム関数を慎重に呼び出す必要があります。

将来、これらの関数のいずれかにさらに魔法が追加される可能性があります。一般に、いつでも利用可能な最高レベルのAPIを使用する必要があります。

于 2010-09-25T00:43:15.463 に答える
1

おそらくobject_getIvar何か違うことをするわけではありませんが、タイプまたは他のオブジェクトタイプのインスタンス変数idが一般的であり、呼び出しivar_getOffsetて結果を値に追加してobjectから適切なタイプにキャストするのははるかに面倒です。

void *C99 標準 (強調鉱山) からの次の情報に基づいて、a の値を確実にインクリメントできないことに注意してください。

C99 §6.2.5 (1): (...) 型は、オブジェクト型(オブジェクトを完全に記述する型)、関数型(関数を記述する型)、および不完全型(オブジェクトを記述するが、必要な情報を欠いている型) に分割されます。サイズを決定します)。

C99 §6.2.5 (19):void型は値の空のセットで構成されています。完成できない不完全型です。

C99 §6.5.6 (2): 加算の場合、両方のオペランドが算術型を持つか、一方のオペランドがオブジェクト型へのポインターで、もう一方が整数型でなければなりません。(増加は 1 を追加することと同じです。)

C99 §6.5.2.1 (1): 式の 1 つは「オブジェクト型へのポインター」型を持ち、もう 1 つの式は整数型を持ち、結果は「型」型を持ちます。

ポインターを任意の数だけインクリメントするには、代わりに使用できますchar *

于 2010-08-26T05:46:32.937 に答える