Различия в методах создания объекта Objective-C.

#objective-c #initialization

#objective-c #инициализация

Вопрос:

Каковы были бы основные различия между этими двумя методами:

   (id)videoGameWithTitle:(NSString *)newTitle publisher:(NSString *)newPublisher year:(int)newYear {
    VideoGame *game = [[[VideoGame alloc] init] autorelease];
    game.title = newTitle;
    game.publisher = newPublisher;
    game.year = newYear;

    return game;
}

- (id)initVideoGameWithTitle:(NSString *)newTitle publisher:(NSString *)newPublisher year:(int)newYear {

    self = [super init];

    if(self) {
        self.title = newTitle;
        self.publisher = newPublisher;
        self.year = newYear;
    }
    return self;
}
  

Комментарии:

1. Первый метод не является инициализатором: это удобный конструктор . Второй метод представляет собой попытку быть инициализатором, но при этом терпит неудачу, поскольку это метод класса, который пытается вести себя как метод экземпляра. В качестве дополнительного примечания, второй метод не соответствует соглашению Cocoa об именовании инициализаторов как init…

2. @Bavarious — 1 за ваш комментарий. Я исправил опечатку в вопросе, поскольку подозреваю, что @Peter предполагал, что второй метод на самом деле будет инициализатором с правильным именем. (Тело метода, безусловно, выглядит так, как будто это то, что он имел в виду.)

3. @шерм Пендли — Откат ваших правок. Вы полностью изменили вопрос — вы предполагаете, что в OP действительно было допущено так много опечаток — что делает его другим вопросом.

4. @Bavarious почему второй метод является методом класса, который пытается вести себя как метод экземпляра? Второй метод объявляется с помощью «-«, что, как я полагаю, делает его методом экземпляра. @Sherm Pendley — Я полагаю, что вы правы в своих предположениях, хотя теперь, когда вопросы были отредактированы, я не помню, что именно я написал изначально. Могу ли я посмотреть, как выглядел мой первоначальный вопрос?

5. Да, там, где написано «отредактировано», нажмите на «xx минут назад», чтобы просмотреть список всех изменений. Первоначально он был объявлен идентично первому методу. Для меня это выглядело как опечатка с копированием и вставкой, особенно учитывая, как было написано тело метода.

Ответ №1:

Первый метод — это метод класса, который создает объект, который вызывающей стороне не принадлежит и который не должен освобождать. Второй (помимо опечатки в вашем исходном вопросе) — это инициализатор, и поскольку вызывающий должен вызывать его в сочетании с alloc , он возвращает объект, которым владеет вызывающий и который должен освободить.

Для получения полного объяснения, включая описание того, какие имена методов подразумевают владение, а какие нет, ознакомьтесь с руководством Apple по программированию управления памятью.