Можем ли мы освободить память в Objective-c, которой переменная не принадлежит, но на которую она указывает? - PullRequest
1 голос
/ 31 марта 2011

У меня есть такой код:

NSObject *var1 = [[NSObject alloc] init];
NSObject *var2 = var1;
[var2 release]; 

var1 = nil;

Это правильно или это утечка памяти? Насколько я знаю, только var1 может освободить выделенную память в первой строке в соответствии с политикой Object Ownership

Ответы [ 4 ]

2 голосов
/ 31 марта 2011

Ваш код будет освобождать память, потому что есть один выделение и одно освобождение - количество указателей на объект не имеет значения.

Владение - это концепция , о которой говорится в политике владения объектами , потому что если вы будете следовать руководящим принципам, это облегчит управление и в конечном итоге предотвратит проблемы, связанные с выпуском вещей, которые вы не должны отпустить (или не выпускать вещи, которые вы должны).

0 голосов
/ 31 марта 2011

Это объект, который ведет счетчик ссылок, а не указатель на объект. Если у вас есть дюжина указателей на объект, вы можете использовать любой из них, чтобы освободить объект, потому что все они указывают на один и тот же объект. Тем не менее, намного проще следовать вашему коду и убедиться, что у вас нет проблем с управлением памятью, если вы не играете в такие игры.

0 голосов
/ 31 марта 2011

Ваш код в порядке и не течет. Но, похоже, вы не совсем понимаете указатели. Указатель не может владеть другим объектом, это просто ссылка, которая сообщает компьютеру, к какому объекту осуществляется доступ. В модели какао с подсчетом ссылок не имеет значения, сколько указателей указывают на один объект.

Вы действительно должны изучить C (особенно в отношении указателей), прежде чем пытаться изучать Objective-C.

0 голосов
/ 31 марта 2011

Ваш пример не приведет к утечке памяти, поскольку var1 и var2 указывают на один и тот же объект в памяти - таким образом, вызов alloc имеет соответствующий release.Если бы NSObject было сохранено в том виде, в котором оно было присвоено var2, произошла бы утечка памяти, поскольку не было бы совпадений release.

Когда в руководстве по управлению памятью говорится о концепции владения, это не означает, что переменная (например, var1) владеет объектом;это больше о том, какая «область» владеет им (например, класс или метод).В вашем примере метод, содержащий эти операторы, будет отвечать за освобождение объекта.

...