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

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

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

var1 = nil;

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

4 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам