Вопрос инициализации NSDate, связанный с управлением памятью в Objective-C
-
11-09-2019 - |
Вопрос
у меня есть 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];
}