Почему некоторые объекты не нужно инициализировать перед использованием в target-c? - PullRequest
4 голосов
/ 13 мая 2011

Почему некоторые объекты не нужно инициализировать перед использованием в target-c? Например, почему это NSDate *today = [NSDate date]; законно?

Ответы [ 4 ]

4 голосов
/ 13 мая 2011

Они инициализируются в методе date.Это распространенный способ создания автоматически выпущенных объектов в Objective-C.Распределители этой формы называются удобными распределителями.

Чтобы узнать больше об этом, прочитайте параграф «Фабричные методы» в документе Apple, посвященном компетенции Cocoa Core о создании объектов: http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/ObjectCreation.html

Чтобы создать удобствоРаспределитель для ваших собственных классов, реализовать метод класса, названный в честь вашего класса (без префикса).например:

@implementation MYThing
...

+ (id)thing
{
  return [[[MYThing alloc] init] autorelease];
}

...
@end
1 голос
/ 13 мая 2011

today инициализируется (и автоматически высвобождается) в вызове статической даты.

0 голосов
/ 13 мая 2011

Две части.

Во-первых, как уже упоминали другие, метод может инициализировать, а затем автоматически освобождать объект перед его возвратом. Это часть того, что здесь происходит.

Другая часть, как это определяется. Обратите внимание, как большинство определений Objective C начинаются с -? Тот, который вы упоминаете, не делает. Подпись выглядит так:

+ (NSDate*) date;

То есть это метод class и применяется к классу в целом, а не к экземпляру этого класса.

0 голосов
/ 13 мая 2011

Вам нужно вызывать метод init… только для объектов, которые вы выделили, вызывая alloc. alloc резервирует только пространство, необходимое для объекта, создавая объект в унифицированном виде.

У объекта неинициализированный все переменные экземпляра установлены на ноль, ноль или эквивалент для типа. За исключением счетчика сохранения, установленного на 1.

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

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

...