Как работает ARC в следующем фрагменте кода в ios? - PullRequest
0 голосов
/ 11 декабря 2018

Допустим, у меня есть метод, который возвращает указатель на объект

-(MyObj *) returnMyObj {
   MyObj *obj = [MyObj alloc] init];
   return obj;
}

Если я вызываю эту функцию без назначения указателя, как это

Сценарий 1

[self returnMyObj];

и если я вызову эту функцию с присвоением указателя, подобного этому

Сценарий 2

MyObj* obj = [self returnMyObj];

Компилятор может освободить объект наконец вызова метода returnMyObj в сценарии 1, но он не может сделать то же самое в сценарии 2. Как ARC решает, нужно ли ему сохранять созданный объект в конце вызова метода или нет в обоих случаях?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вот что ARC статья в документации должна сказать:

Чтобы убедиться, что экземпляры не исчезают, пока они еще необходимы, ARC отслеживает, сколькосвойства, константы и переменные в настоящее время ссылаются на каждый экземпляр класса.ARC не освобождает экземпляр, пока существует хотя бы одна активная ссылка на этот экземпляр.

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

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

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

0 голосов
/ 11 декабря 2018

Оптимизатор может полностью освободить объект в сценарии 2 в конце оператора, если на obj нет ссылки позже в блоке.

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

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

...