Эта форма метода класса используется для выделения и инициализации объекта. Однако вы установили objOpponentTTL
в ноль в его объявлении и никогда не выделяете его, хотя в своем описании вы упоминаете обязательную строку выделения. Если бы эта строка была включена, эта функция была бы в основном нормальной. Хотя (как упоминается в издании) тот факт, что он называется getXXX
, противоречит условности; метод класса, подобный этому, должен быть назван в честь типа объекта, который он создает и возвращает.
Что касается вопроса о том, когда его выпускать, то это полностью зависит от его жизненного цикла и объема объекта-владельца. Короткий ответ: когда тебе это больше не нужно!
Например, если этот объект представляет собой особые данные, связанные с командой, и команда принадлежит к игре, вы бы выпустили ее в методе dealloc вашей игры. И игра, вероятно, будет создана и выпущена контроллером.
Другие упоминали авто-релиз, но это, вероятно, не то, что вы хотите здесь. Это полезно, если у вас есть временный объект, который вы хотите вернуть из метода, но у вас больше не будет дескриптора (возвращение NSString
- хороший пример). Похоже, что это часть большего набора объектов.
Вам действительно нужно подумать о дизайне вашего приложения и о том, как взаимодействуют объекты. Нарисуйте несколько диаграмм последовательности и посмотрите, какая информация необходима, когда и по каким объектам. Приведенный выше пример (где контролер владеет игрой, в которой есть игроки) является довольно общей отправной точкой.
Область объекта (и где он объявлен) говорит вам многое. Например, если объект является членом данных, вы обычно выделяете его в методе init
или awakeFromNib
и освобождаете его в методе dealloc
. Если это фабричный метод (такой как ваш пример), вы должны его создать и (по соглашению) вызывающий должен освободить его. И если это средство доступа, которое создает одноразовый объект, вы, вероятно, используете авто-релиз.
Как уже отмечали другие, документация Apple по управлению памятью очень хорошая. Существуют очень четкие соглашения о том, как безопасно управлять памятью, поэтому стоит придерживаться их и следовать этим соглашениям в своем собственном коде.