Подсчет ссылок в Какао - PullRequest
0 голосов
/ 06 июля 2010

Я предполагаю, что согласно книге «Шаблоны проектирования Какао» я читаю, что функция сохранения реализована с использованием чего-то подобного:

   - (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;
}

Как видно из примера, каждый ссылочный объект имеет один и тот же элемент-член. Как это происходит? может быть, я не понимаю смысла «я» - хотя в C ++ это похоже на «это».

Если я просто использую оператор присваивания (A = B), копирует ли он указатель (self) и все? Я думал, что он будет использовать «copywithzone», и его родственники и «я» члены не будут равны. Более того, я думаю, что copywithzone похож на конструктор копирования в c ++.

Полагаю, я путаю эти два мира.

Ответы [ 2 ]

1 голос
/ 06 июля 2010

В качестве примера подразумевается каждый ссылочный объект…

Не существует такого понятия, как «эталонный объект». Я подозреваю, что это не то, что вы имели в виду, поэтому, пожалуйста, уточните.

имеет того же самого члена.

Объекты не имеют членов (экземпляры имеют переменные экземпляра, которые похожи по концепции, но не одинаковы по реализации).

self не является ни «членом», ни переменной экземпляра. Обратите внимание, что классы также имеют self. self - это специальный скрытый аргумент сообщения, содержащий объект, который является получателем сообщения.

И нет, self не относится к каждому объекту сразу. Если вы отправляете одно и то же сообщение двум разным объектам, даже одного и того же класса, аргумент self будет содержать разные указатели в каждом сообщении.

может быть, я не понимаю смысла "я" - хотя в C ++ это похоже на "это".

Как я понимаю "this", да. self - это объект, который получил сообщение - в ваших примерах, объект, который что-то хранит или запрашивает счет сохранения.

Если я просто использую оператор присваивания (A = B) Копирует ли он указатель (self) и все?

Скопированный указатель будет только self, если B равен self. То есть, если вы скажете A = self, он скопирует указатель self в A. Если вы говорите B = self, а затем говорите A = B, то же самое, поскольку B и self содержат один и тот же указатель. Если вы не сказали B = self, то B, вероятно, является другим значением, поэтому другое значение будет скопировано в A. И это при условии, что A и B являются переменными указателя.

Он скопирует значение (указатель), который вы скажете ему скопировать. Больше ничего.

Я думаю, что он будет использовать "copywithzone", и его родственники и члены "self" не будут равны.

Нет. Объекту отправляется сообщение copyWithZone: (не пропускайте двоеточия - они значимы), когда что-то отправляет ему сообщение copyWithZone:. Самый распространенный способ - отправить ему сообщение copy, так как оно будет отправлять сообщение copyWithZone: по очереди.

Кроме того, даже «копия» не всегда копирует объект. Неизменяемые объекты могут реализовать copyWithZone: для возврата [self retain] вместо.

Однако простое назначение никогда не копирует объект. Он только копирует указатель.

Более того, я думаю, что copywithzone похож на конструктор копирования в c ++.

Грубо. Я не знаю достаточно C ++, чтобы сказать, насколько это нравится.

1 голос
/ 06 июля 2010

Я помню, что слышал, что вы не должны делать никаких предположений относительно retainCount.: -)

self действительно очень похоже на это.

Назначение просто копирует указатель, и то же самое в C ++.

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

objA и objB ссылаются на тот же объект.

Не то чтобы ваш пример кода использовал [self class], поэтому они использовали бы одну таблицу на класс для всех экземпляров этого класса.

...