Можем ли мы освободить часть памяти в 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
) владеет объектом; это больше о том, какая "область" владеет им (например, класс или метод). В вашем примере метод, содержащий эти операторы, будет отвечать за освобождение объекта.