Почему [NSDate date] возвращает идентификатор?

Почему он не возвращает NSDate*?

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

Теперь я не могу сделать NSDate.date.timeIntervalSince1970: (

Я думал, что компилятор достаточно умен, чтобы узнать, что NSDate.date возвращает NSDate, хотя тип возвращаемого значения - id?

Ответ 1

UPDATE

Начиная с iOS 7, Apple использует instancetype как возвращаемый тип для большинства фреймворческих API-интерфейсов Foundation (и других фреймворков), так что теперь, например, +date of NSDate имеет следующую подпись:

+ (instancetype)date

Я просто написал короткую статью об этом.

Оригинальный ответ

Конструкторы и методы factory возвращают id, чтобы позволить подклассам использовать их без ovverriding.

Представьте, что у вас есть подкласс NSDate, называемый NSMutableDate.

Если вы вызываете

[NSMutableDate date]

теперь вы ожидаете вернуть объект NSMutableDate *, но если date возвращал NSDate *, вам пришлось бы переопределить этот метод, изменяя тип возвращаемого значения.

Использование id допускает такую ​​гибкость.

На самом деле компилятор clang имеет ключевое слово instancetype, которое пригодится, если вы определяете свои собственные методы factory. Недавно я говорил об этой конкретной проблеме здесь.

Ответ 2

Методы класса factory (например, [NSMutableDate date], [NSMutableArray array] и т.д.) используют alloc/init и возвращают все init.

init, а его братья и сестры (initWith...) всегда возвращают id, а также расширением, а также методы класса factory.

Ответ 3

Это метод factory, обеспечивающий удобный способ создания новых автоматически выпущенных объектов.

Смотрите руководство Apple.