В Какао есть такое соглашение:
- Методы, которые начинаются с
alloc
или new
, возвращают объект с сохранением количества + 1
- все другие методы, которые создают объект, возвращают объект, выпущенный автоматически.
Обратите внимание, что с помощью метода init
, который вы опубликовали выше, объект не создается. Предыдущий вызов alloc
создает объект. Это просто настраивает его и делает его готовым к использованию.
Что касается вашего makeWithId
метода, вы перепутали две концепции. Такой фабричный метод должен быть методом класса (т. Е. Объявленным с +
, а не -
). Тогда вы будете использовать его как
Person *p = [Person makeWithId:3];
В существующем состоянии вы возвращаете объект, отличный от получателя вызова метода. Это означает, что когда вы делаете
Person *p = [[Person alloc] makeWithId:3];
Объект Person
, созданный с помощью alloc
, утек, а p
автоматически освобожден.
Итак, подведем итог: возвращайте автоматически освобожденные объекты из методов класса factory и не выполняйте никакого управления памятью в методах init
.