Авто-релиз в пользовательских методах инициализации - PullRequest
0 голосов
/ 26 декабря 2011

Меня немного смущают принципы автоматического высвобождения объектов из пользовательских методов init. Например:

- (id)initWithId: (unsigned long)personID {
    self = [super init];
    if (self) {
        self.ID = personID;
    }

    return self;
}

В соответствии с правилами кодирования objc, я должен самовосстанавливаться по возвращении. Но такой код продолжает разрушать. Я что-то упустил? Должен ли я автоматически выпускать только те объекты, которые я создаю вручную в этих методах, но не "self", как это?

- (id)makeWithId: (unsigned long)personID {
    Person *obj = [[Person init] alloc];

    if (obj) {
        obj.ID = personID;
    }

    return [obj autorelease];
}

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 26 декабря 2011

В Какао есть такое соглашение:

  • Методы, которые начинаются с alloc или new, возвращают объект с сохранением количества + 1
  • все другие методы, которые создают объект, возвращают объект, выпущенный автоматически.

Обратите внимание, что с помощью метода init, который вы опубликовали выше, объект не создается. Предыдущий вызов alloc создает объект. Это просто настраивает его и делает его готовым к использованию.

Что касается вашего makeWithId метода, вы перепутали две концепции. Такой фабричный метод должен быть методом класса (т. Е. Объявленным с +, а не -). Тогда вы будете использовать его как

Person *p = [Person makeWithId:3];

В существующем состоянии вы возвращаете объект, отличный от получателя вызова метода. Это означает, что когда вы делаете

Person *p = [[Person alloc] makeWithId:3];

Объект Person, созданный с помощью alloc, утек, а p автоматически освобожден.

Итак, подведем итог: возвращайте автоматически освобожденные объекты из методов класса factory и не выполняйте никакого управления памятью в методах init.

2 голосов
/ 26 декабря 2011

Вы ничего не выделяете, поэтому вам не нужно что-то выпускать.

Вы можете автоматически высвобождать свой объект при его создании.

YourClass *yourOblect = [YourClass alloc] initWithId:27] autorelease];
[yourObject doSomething];
.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...