Когда вы делаете ...
var image: CIImage = MyCIImage(cvPixelBuffer: somePixelBuffer)
..., что приведет к вашему первому оператору записи «Init».
Когда вы тогда выполните ...
image = MyCIImage(cvPixelBuffer: someOtherPixelBuffer)
... это будет делать две вещи:
Вы создаете новый экземпляр MyCIImage
, который приводит к другому сообщению журнала «Init», связанному с этим новым экземпляром. ,
Но поскольку вы заменяете свою сильную ссылку, image
, на старую MyCIImage
ссылкой на новую, вы удаляете свою сильную ссылку на это первый случай. А поскольку у этого первого экземпляра нет остающихся сильных ссылок, он будет освобожден, и вы увидите связанное с ним сообщение журнала «Deinit».
Вы спросили:
Почему память вообще деинициализируется, а не просто переназначается? Разве адрес памяти не останется прежним, и элемент, в котором адрес памяти просто изменится?
Нет. Когда вы создаете новый экземпляр (с синтаксисом MyCIImage(...)
), он создает новый объект с новым адресом. Вот как работает подсчет ссылок и автоматов c.
Если нет, то возможен ли этот случай? Так что образ памяти @ address никогда не равен нулю, просто постоянно меняется?
Единственный способ предотвратить получение нового адреса - это если вы воздержитесь от создания нового экземпляра вашего типа (т.е. , если вы работаете только с этим оригинальным экземпляром и избегаете создания нового).
Но если это новое изображение, мы просто создаем для него новый экземпляр и не беспокоимся о том, что это новый объект. Многие из свойств (например, pixelBuffer
, cgImage
, et c.) Вашего родительского класса, CIImage
только для чтения и не могут быть выгружены или изменилось за кадром. Ваш родительский класс CIImage
действительно предназначен для одного уникального изображения. Как общий принцип проектирования, это очень хорошая вещь, позволяющая избежать многих видов проблем, которые могут возникнуть в результате непреднамеренного совместного использования. И в этом случае, именно так CIImage
был разработан для работы.