2010-07-06 4 views
0

Я полагаю, в соответствии с «Cocoa Design Patterns» книги я читаю, что функция сохранения реализуется с помощью что-то вроде этого:Подсчет ссылок в какао

- (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++.

Наверное, я запутался между двумя мирами.

ответ

1

Как пример подразумевает, каждый объект ссылки ...

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

имеет тот же самый элемент.

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

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», а его родственники и члены «я» не были равны.

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

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

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

Более того, я, хотя copywithzone, как конструктор копирования в C++.

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

+0

Как и в сценарии в commennt выше вашего, вызов [objB keep] и вызов [objA keep] будет содержать другой параметр «self», как вы сказали, что сделает мой пример функции «сохранить» неправильным. Так кто же это? Мое понимание ? Потому что я уверен, что пример верен. Я просто означаю, что присваивание типа "SObject * objB = objA;" приведет к тому, что функция сохранения обоих объектов будет иметь одинаковую «я» при вызове (или любой другой функции) – Idan

+0

Да, ваше понимание. См. Последний абзац ответа Эйко о том, что происходит в вашей реализации 'keep'. Когда вы назначаете 'objB = objA', нет« обоих объектов »; существует один объект, указатель которого находится в двух переменных. В этом случае '[objA keep]' и '[objB keep]' будут отправлять сообщение 'keep' одному и тому же объекту, что означает, что они будут запускать одну и ту же реализацию' keep', и эта реализация получит одинаковое значение 'self' оба раза. –

+0

Отлично, это почти то, о чем я думал, как вы можете видеть из моей последней строки комментариев выше. Большое спасибо! – Idan

1

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

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

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

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

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

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

Смежные вопросы