Вопрос инициализации NSDate, связанный с управлением памятью в Objective-C

StackOverflow https://stackoverflow.com/questions/1240742

Вопрос

у меня есть NSDate объект, созданный

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

Позже я хочу сбросить дату на «сейчас», поэтому я подумал, что

[date init];

или

date = [date init];

могли бы выполнить эту работу, но они этого не делают.Вместо,

[date release];
date = [[NSDate alloc] init];

работает.Меня это немного смущает, поскольку в документации для - (id) init, там написано:

Возвращает объект NSDate, инициализированный текущей датой и временем.

и с тех пор date уже выделено, разве ему не нужно просто init сообщение?

Это было полезно?

Решение

Думать о alloc и init как логически неразделимые половинки конструктора.Вы можете вызывать методы, начинающиеся с «init», для данного объекта только один раз — после того, как объект был инициализирован, и повторная инициализация его является ошибкой.Это справедливо для любого объекта Objective-C, а не только для NSDate.Однако объекты NSDate также неизменный — однажды созданные, они не могут измениться.

Причина, по которой последний код работает, заключается в том, что вы создаете новый экземпляр NSDate, и это правильно.Вы также можете использовать [NSDate date] для достижения той же цели.Имейте в виду, что он возвращает объект, которым вы (пока) не владеете, поэтому вам придется сохранить его, если вам нужно сохранить его, и выпустить его позже.

Имейте в виду, что если вы получаете от кого-то объект, он уже инициализирован.(Если нет, то это программная ошибка в коде, который ее предоставил, или крайне редкое исключение из правила.)

Другие советы

Если вы хотите получить текущую дату, вы можете просто использовать:

NSDate * now = [NSDate date];

Если ты хочешь сохранить это, тогда retain это.

NSDate * now = [[NSDate date] retain];

Вы не можете сбросить NSDate с init init предназначен только для первой инициализации объекта.

Вы можете просто получить другую дату:

NSDate * now = [[NSDate date] retain];
// use the now object
// need new date
[release now];
now = [[NSDate date] retain];
// once you don't need it release it
[now release];

А date сообщение возвращается autoreleased случай NSDate, следовательно release или autorelease.

А autorelease используется для случаев, когда не хочется беспокоиться о том, где именно нужно освободить объект — он помещается в autorelease pool.Объект в пуле автоматического выпуска освобождается после окончания итерации цикла событий или при вызове выпуска в пуле...(подробнее об управлении памятью см. в документации Apple).

Кстати.тот [NSDate date] это удобный метод, вероятно, что-то вроде (не гарантируется, что он будет точно таким же, но функционально похож на):

- (NSDate *)date
{
    return [[[NSDate alloc] init] autorelease];
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top