Вот строка вашего кода:
self.horizontalLineView = [[HorizontalLineView alloc] initWithFrame:self.frame];
Напомним, что свойство horizontalLineView
является слабым. Давайте пройдемся по тому, что действительно происходит в этой строке, с дополнительным кодом, который генерирует ARC. Сначала вы отправляете методы alloc
и initWithFrame:
, получая надежную ссылку:
id temp = [[HorizontalLineView alloc] initWithFrame:self.frame];
На данный момент объект HorizontalLineView
имеет счет сохранения 1. Далее, поскольку вы использовали точечный синтаксис для установки свойства horizontalLineView
, компилятор генерирует код для отправки метода setHorizontalLineView:
в self
, передав temp
в качестве параметра. Поскольку свойство HorizontalLineView
объявлено weak
, метод установки делает это:
objc_storeWeak(&self->_horizontalLineView, temp);
Это устанавливает self->_horizontalLineView
равным temp
и помещает &self->_horizontalLineView
в список слабых ссылок объекта. Но он не увеличивает счетчик сохранения HorizontalLineView
объекта.
Наконец, поскольку переменная temp
больше не нужна, компилятор генерирует это:
[temp release];
Это уменьшает количество сохраняемых объектов HorizontalLineView
до нуля, поэтому освобождает объект. Во время освобождения он просматривает список слабых ссылок и устанавливает для каждой nil
. Так что self->_horizontalLineView
становится nil
.
Способ исправить это - сделать переменную temp
явной, чтобы вы могли продлить срок ее службы до тех пор, пока вы не добавите объект HorizontalLineView
в его суперпредставление, которое сохраняет его:
HorizontalLineView *hlv = [[HorizontalLineView alloc] initWithFrame:self.frame];
self.horizontalLineView = hlv;
// ...
[self insertSubview:hlv atIndex:0];