2013-08-14 2 views
1

Я занимаюсь некоторыми учебниками в Objective-C, и я смущен, когда дело доходит до команды alloc() и как она используется для инициализации объекта.Зачем нужен объект Object-C для инициализации объекта?

В учебнике говорится, что нужно сделать следующее, и мне трудно понять, почему это необходимо.

Изменить

NSDate *now = [NSDate date]; 

в

NSDate *now = [[NSDate alloc] init]; 

Почему это изменение необходимо, так как в первой линии работает нормально? Наверное, я ищу, как две линии различаются. Благодаря!

ответ

9

Существует простая разница и более глубокая.

Простой ответ заключается в том, что первый метод включает внутреннюю партию +alloc/-init - документация сообщает нам, что она возвращает новый объект даты, инициализированный текущим временем. Как правило, где-то, кто-то должен позвонить +alloc и метод -init. Иногда это вы, иногда метод удобства был включен для вас.

Чем глубже ответ о разнице в том, что +alloc/-init возвращает объект, который принадлежит вызывающему, который является ответственным за вызов -release в какой-то момент, в то время как удобство конструкторы, которые не начинаются со слов «Alloc» или «новые» возвращенные автореализованные объекты, которые вам не нужно выпускать. Однако, если вы используете ARC, это в основном академический, поскольку компилятор отслеживает эту деталь для вас.

+0

Спасибо, Джош. Торопился. –

+0

Несомненно, @Seamus. –

3

С ARC это не имеет значения, поскольку вам больше не нужно выделять объекты, которые вы назначаете init.

Без АРК разница важно:

[NSDate date] 

возвращает autoreleased объект, используя метод класса на NSDate.

[[NSDate alloc] init] 

возвращает экземпляр объекта, не автореализованного объекта, с сохранением количества экземпляров.

Как и в случае без ARC, вам необходимо взять управление памятью в свои руки. Таким образом, alloc init - лучший вариант. Итак, вы можете его выпустить, если это не требуется.

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

Когда вы назначаете init, вы знаете, что ваш объект останется вокруг, пока вы его не отпустите (или вы пропустите его, потому что он выходит за рамки).

+2

В принципе, '[NSDate date]' является оболочкой, которая использует 'alloc init' внутренне. –

+0

@John_Woods, [NSObject new] возвращает экземпляр с автореализацией? Из моего понимания правил, которые он делает, просто нужно подтвердить это? – pnizzle

+0

@pnizzle, Да, это правильно, очевидно, с ARC это на самом деле не имеет значения! – Woodstock

0

Изменения вообще не нужны. Неважно, если вы создаете объект, используя alloc+init или используя удобные методы. Подумайте о них как устаревшие и удобные методы.

+0

Это не обязательно в ARC. В ручном сохранении релиз существует большая разница ... – bbum

+0

@bbum Если в учебнике, который он упоминает, говорится, что переход от автореализованного объекта к собственному необходимо, чем учебник ошибочен. Есть ли причина для этого? Кроме того, я предполагаю, что каждый использует ARC сегодня. Особенно это должны делать новички. – Tricertops

4

Разбить его:

NSDate класс.Таким образом, NSDate alloc - это вызов метода класса alloc. Это фактически унаследовано от NSObject и действует для создания достаточного хранилища для нового экземпляра NSDate, а затем возвращает его для использования в качестве экземпляра.

(instance) init - вызов метода экземпляра init. До вызова init экземпляр, который вы получили, не может быть в правильном состоянии. Вызов init или соответствующий инициализатор дает экземпляру возможность установить себя.

NSDate также выбирает метод класса date. Это делает то же самое, что и [[[NSDate alloc] init] autorelease], и предоставляется в виде простой стенографии.

Как и другие плакаты, существует смысловая разница здесь - alloc возвращает ссылку на владение. Таким образом, ответственность за звонящего составляет release. date возвращает ссылку без права собственности. Таким образом, у абонента нет обязанностей. Однако современный компилятор ARC будет заниматься выпуском вещей для вас. Таким образом, есть разница, но не та, которая оказывает на вас реальное влияние.

Если ваш учебник настаивает на том, что date более подходит, либо он был написан до компилятора ARC, либо был написан кем-то, кто предпочитает использовать старые соглашения; используя date, традиционно сообщал бы, что вещь, которую вы создавали, использовалась для временного использования, поэтому, возможно, какая-то дополнительная ценность в одном направлении для другого опытного разработчика.

+0

Благодарим вас за подробное объяснение. В учебнике «Программирование Objective-C: The Big Nerd Ranch Guide» начинается использование метода shothand 'NSDate * now = [NSDate date];' и затем переключается на метод с использованием alloc. Пример был в разделе, описывающем вложенные сообщения, поэтому, возможно, именно поэтому он был использован. Я был смущен, потому что первый метод казался гораздо более простым в использовании. – webworm

Смежные вопросы