0

私が読んでいる「ココアデザインパターン」の本によると、保持機能は次のようなものを使用して実装されていると思います:

   - (int)retainCount
// Returns the receiver's current reference count
{
int result = 1; // receiver not in table, its count is 1
void *tableValue = NSMapGet(
[[self class] _myRefCountMapTable], self);
if(NULL != tableValue )
{ // if receiver is in table, its count is the value stored
result = (int)tableValue;
}
return result;
}

- (id)retain
// Increases the receiver's reference count
{
// store the increased value in the table
NSMapInsert([[self class] _myRefCountMapTable], self,
(void *)([self retainCount] + 1));
return self;
}

例が示すように、すべての参照オブジェクトは同じ self メンバーを持ちます。それはどのように起こりますか?たぶん私はselfの意味を理解していません-C++で「これ」のようなものだと思います。

代入演算子 (A=B) だけを使用すると、ポインター (自己) がコピーされますか? 「copywithzone」を使用すると思いますが、それは親戚であり、「自己」メンバーは等しくありません。また、copywithzone は c++ のコピー コンストラクターのようなものだと思います。

私は2つの世界の間で混乱していると思います。

4

2 に答える 2

1

例として、すべての参照オブジェクトを示しています…</ p>

「参照オブジェクト」のようなものはありません。それはあなたの意図したことではないと思うので、明確にしてください。

同じ自己メンバーを持っています。

オブジェクトにはメンバーがありません(インスタンスにはインスタンス変数があり、概念は似ていますが、実装は同じではありません)。

selfは「メンバー」ではなく、インスタンス変数でもありません。クラスにもあることに注意してくださいselfselfメッセージの受信者であるオブジェクトを含む、メッセージに対する特別な隠し引数です。

いいえ、self一度にすべてのオブジェクトを参照するわけではありません。同じクラスであっても、2つの異なるオブジェクトに同じメッセージを送信すると、self引数には各メッセージに異なるポインタが含まれます。

自己の意味がわからないかもしれませんが、C++では「これ」のようです。

「<code>this」を理解しているので、そうです。selfメッセージを受信したオブジェクトです。例では、何かが保持しているオブジェクト、または保持カウントを要求しているオブジェクトです。

代入演算子(A = B)を使用する場合、ポインター(自己)をコピーしますか?それだけですか?

コピーされるポインタは、がの場合のみになりselfます。つまり、と言うと、ポインタがにコピーされます。あなたが言うなら、あなたは同じことを言う、それ以来そして同じポインタを含んでいる。と言っていない場合は、おそらく他の値であるため、他の値がにコピーされます。そして、それは仮定であり、ポインタ変数です。BselfA = selfselfAB = selfA = BBselfB = selfBAAB

コピーするように指示した値(ポインタ)をコピーします。他には何もありません。

私はそれが「copywithzone」を使用するだろうが、それは親戚であり、「自己」のメンバーは等しくないだろう。

いいえ。オブジェクトはcopyWithZone:、何かがメッセージを送信したときにのみメッセージを送信します(コロンは省略しないでください。コロンは重要です)copyWithZone:。最も一般的な方法は、copyメッセージを送信することです。これにより、copyWithZone:メッセージが順番に送信されます。

さらに、「コピー」でさえ、常にオブジェクトをコピーするとは限りません。不変オブジェクトは、代わりcopyWithZone:に戻るように実装でき[self retain]ます。

ただし、プレーンな割り当てではオブジェクトがコピーされることはありません。ポインタをコピーするだけです。

さらに、copywithzoneはc++のコピーコンストラクターのようなものです。

だいたい。私はそれがどれほど似ているかを言うのに十分なC++を知りません。

于 2010-07-06T16:52:01.167 に答える
1

私は、retainCount について仮定をするべきではないと聞いたことを覚えています。:-)

self は実際、これに非常によく似ています。

代入はポ​​インタをコピーするだけで、C++ でも同じです。

NSObject *objA =[[NSObject alloc] init];
NSObject *objB = objA;

objA と objB は同じオブジェクトを参照します。

コード例が [self class] を使用しているわけではないため、そのクラスのすべてのインスタンスに対して、クラスごとに 1 つのテーブルを使用します。

于 2010-07-06T09:37:51.620 に答える