понимание ссылки в цели c - PullRequest
0 голосов
/ 27 июня 2011

Я родом из AS3 фона.В AS3, когда вы назначаете объект в var, вы не копируете объект в var, var становится ссылкой на объект.

var myObject = new MyClass();
myObject.name = "Bananas";

var myRef = {};
myRef.ref = myObject;
trace(myRef.ref.name); // Bananas

myObject.name = "Mango";
trace(myRef.ref.name); // Mango

myObject = null;
trace(myRef.ref); // null

В Objective C, AFAIK, когда вы назначаете некоторый объекткакое-то свойство другого объекта «объект копируется». Моя путаница связана с тем, что после использования временного объекта вы можете его освободить.

NSMutableString* myString = [[NSMutableString alloc] initWithString:@"Hello"];
[myLabel setText:myString]; 
[myString release];

... если вы можете освободить его, это означает, что вам не нужноэто больше. Так что это скопировано? или свойство "text" в myLabel является ссылкой на myString?

Как вы можете догадаться, я только начинаю в мире Objective C.

ТИА

Ответы [ 3 ]

6 голосов
/ 27 июня 2011

Нет.Objective-C также использует ссылки (вот почему вы видите * после каждого имени класса, это фактически указатель).Тем не менее, Obj-C также имеет систему управления памятью.Когда вы делаете myString = [[NSMutableString alloc] ...], вы создаете новую строку, которой вы «владеете».Но когда вы вызываете [myLabel setText:myString], метка сохранит строку и фактически вступит во владение.Таким образом, когда вы вызываете [myString release], вы отказываетесь от владения, но поскольку метка все еще имеет владельца, строка фактически не будет освобождена из памяти.

Я рекомендую вам прочитать Руководство по программированию управления памятью для получения дополнительной информации.

0 голосов
/ 27 июня 2011

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

Подробнее см. Руководство по управлению памятью Apple .

0 голосов
/ 27 июня 2011

Выпуск myString - правильная вещь.

myLabel сохранит строку и теперь отвечает за ее освобождение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...