Object * A = [[Object alloc] init] Увеличивает ли это количество хранения?
Да, более конкретно, вероятно, он инициализирует счет удержания равным 1.
Это то же самое, что сохранить Object * A = [[Object alloc] init]]. Я знаю, что если мы вызовем retain, объект будет удерживаться до тех пор, пока мы его не отпустим.
Не то же самое. Это увеличит количество сохраняемых кадров в два раза. Нет особой причины увеличивать счет дважды в одном и том же месте. Если бы вы это сделали, вы бы ответили за то, что дважды позвонили в релиз.
У меня есть оставленный объект A. Этот объект A был передан функции в качестве аргумента. Позже в функции я выпустил его. Это освободит память об объекте А? если это так, объект А больше не существует.
Во-первых, вы должны убедиться, что понимаете, освобождает ли релиз память или нет, зависит от того, есть ли другие владельцы, которые имеют ссылку на объект. Если объект сохранился более чем одной вещью, то освобождение не освободит память в этом случае.
Во-вторых, плохая идея. Чтобы сохранить здравомыслие при подсчете ссылок, вы должны следовать определенным схемам.
- сохранить (или выделить) переменные экземпляра, освободить их в dealloc или ранее.
- при необходимости сохраните (или выделите) локальные переменные и освободите их перед выходом из метода.
- Вызывающая сторона не владеет возвращаемым значением функции. Это подразумевает, что вы обрабатываете возвращаемое значение функции, как локальную переменную, но автоматически освобождаете его, прежде чем возвращать, а не освобождать. Это гарантирует, что оно продлится, по крайней мере, достаточно долго, чтобы вызывающий мог сохранить его, если это необходимо.
Один из шаблонов не для вызывающего метода, чтобы иметь ссылку на аргумент метода, но когда функция возвращает, вызывающий не владеет ссылкой. Метод не должен освобождать ссылку вызывающей стороны.
Следуйте 2.1, вместо освобождения Object A. Я создал локальную переменную Object * B = ObjectA. Если я выпустил B, он также выпустит Объект A. Или, если я оставлю B, он также сохранит A.
retain и release отправляются объектам, а не ссылкам. A и B относятся к одному и тому же объекту, поэтому для одного и того же вызова сохраняются или освобождаются вызовы, как и для другого.
Допустимо, но, вероятно, нет необходимости, [B retain]
и позже тем же способом [B release]
. Но не делайте только [B release]
, тем самым экспроприируя право собственности А. на объект.