Это не двойное удержание; s
сохраняется только один раз.
Причина в том, что вы не вызываете метод синтезатора в вашем инициализаторе. Эта строка:
o = [s retain];
сохраняет s
и устанавливает o
равным s
; то есть o
и s
указывают на один и тот же объект. Синтезированный метод доступа никогда не вызывается; Вы можете полностью избавиться от линий @property
и @synthesize
.
Если бы эта строка была:
self.o = [s retain];
или эквивалентно
[self setO:[s retain]];
тогда будет вызван синтезированный метод доступа, который сохранит значение во второй раз. Обратите внимание, что обычно не рекомендуется использовать методы доступа в инициализаторах, поэтому o = [s retain];
является наиболее распространенным использованием при кодировании функции init
.