Мне интересно, почему [NSDate distantPast]
и [NSDate distantFuture]
методы возвращают типы типа id
? Почему эти методы не возвращают указатель NSDate
?Почему методы [NSDate remotePast] и [NSDate farFuture] возвращают id?
ответ
Поскольку полиморфизм справедлив только в одном случае.
Предположим, что вы подклас NSDate и что вы хотите переопределить этот метод. Вы должны использовать ту же сигнатуру, так что вы будете делать с этой подписью:
-(NSDate*) distantPast;
Но вы не сможете присвоить результат выражения в указатель типа подкласса, и вы будете нуждаться на обратное приведение результата:
NSDateSubclass* ptr= (NSDateSubclass*)[someDateSubclassInstance distantPast];
// Downcasting is necessary here, it would give a warning or syntax error otherwise.
Даже если вы уверены, что возвращаемый объект является подклассом NSDate, необходимо обратное приведение результата. Вот почему все методы, возвращающие созданные объекты, объявляются для возврата идентификатора.
** Обновление: ** На данный момент [они _do_ возвращают 'NSDate *'] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/#//apple_ref/ОКК/CLM/NSDate/distantFuture). –
NSDate
является абстрактный суперкласс, и distantPast
или distantFuture
вернуть частные подклассы NSDate
, а не NSDate
сами по себе.
Тип возврата может иметь тип NSDate, так как полиморфизм действителен. Вы заметили, что все статические методы возвращают id? –
Большинство методов экземпляра также работают. – iluvcapra
Я думаю, что этот вопрос также спрашивает, что вы должны вернуть по методу init
? Идентификатор или указатель на наш класс.
Поскольку в этом случае это будет то же самое, вы можете считать, что это определенная стандартизация со стороны Apple для методов класса.
Нет особых причин для этого. Другой плакат указал, что эти методы могут возвращать частный подкласс NSDate, но подкласс NSDate по-прежнему является NSDate. Я предполагаю, что эти методы достаточно стары (т. Е. NextStep, перед Mac OS), что причины для возвращаемого типа id являются историческими и «утрачены до древности». (Если вы посмотрите на эти методы в документах Mac OS, то говорится, что они были определены в Mac OS 10.0)
Я уверен, что старый подход к школе заключался в том, чтобы везде использовать указатели на анонимные объекты.
Я понял это позже, я тоже подумал. Но полиморфизм действителен только одним способом, поэтому, если вы попытаетесь инициализировать указатель типа подкласса с помощью этого метода, вы получите синтаксическую ошибку или предупреждение, и вам нужно будет сбрасывать возвращаемый тип. –
Верно, что кластер классов не является причиной возвращаемого типа 'id'. Возврат подкласса через возвращаемый тип суперкласса допустим: '- (NSArray *) myArrayProperty {return _myInternalArrayWhichIsActuallyMutable; } 'отлично. Это наследование - это проблема: если '+ [NSArray array]' return '(NSArray *)', то 'NSMutableArray * array = [NSMutableArray array];' заставит компилятор жаловаться. –
- 1. Swift NSDate и печать (NSDate)
- 2. NSDate и NSDateComponents возвращают неправильную дату
- 3. Что делает «[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate farFuture]]« делать?
- 4. Почему эти методы пропускают объекты NSDate?
- 5. Значение NSDate недоступно через методы
- 6. Локализовать NSDate и изменить часовой пояс NSDate
- 7. NSDate читается как NSDate и NSCFString
- 8. Сравнить NSDate с сервера и локальной NSDate
- 9. NSDate и двойной точности проблема
- 10. Сравнение NSDate с [NSDate date]
- 11. Преобразование описания NSDate в NSDate?
- 12. NSDate и NSDateFormatter вопросы
- 13. UIDatePicker и NSDate
- 14. NSDate недели
- 15. Несовместимый тип указателя, назначающий NSDate * из NSDate *?
- 16. iOS NSDate и NSManagedObject
- 17. Передача NSDate
- 18. Почему NSDate отличается внутри строки?
- 19. Swift: NSDate минус NSDate в часах
- 20. IOS - Сравнение NSDate с другим NSDate
- 21. Проблема NSDate и DateByAddingComponents
- 22. Объектив c и NSDate
- 23. NSDate и NSDateFormatter несовместимого
- 24. Основные данные и NSDate
- 25. NSDate и SQLite3
- 26. UIDatePicker и NSDate
- 27. Управление NSDate и память
- 28. CorePlot CPTAxisLabelingPolicyAutomatic и NSDate
- 29. NSDate и UIWebView
- 30. Проблема NSDate
Связанные: [Методы класса, которые создают новые экземпляры] (http://stackoverflow.com/q/5987969) –
** Обновление: ** На данный момент [они _do_ возвращают 'NSDate *'] (https: //developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/#//apple_ref/occ/clm/NSDate/distantFuture). –