Ответ 1
Это методы класса, а не статические методы 1. Этот конкретный тип, создающий автореализованные объекты, можно назвать "factory методами" (ранее также "конструкторы удобства" ), и они обсуждаются в Концепции в руководстве ObjC. Они идут примерно так:
+ (instancetype)whatsisWithThingummy: (Thingummy *)theThingummy {
return [[self alloc] initWithThingummy:theThingummy];
}
Где Whatsis
- ваш класс, а Thingummy
- это еще один класс, который использует ваш класс.
Если вы не компилируете с ARC, соглашение должно быть autorelease
экземпляром перед его возвратом.
instancetype
ключевое слово было введено Clang для этих методов; в сочетании с self
(это объект класса сам 2 в методе класса), он позволяет корректное поведение подкласса: метод создает экземпляр класса, который получил сообщение. 3instancetype
позволяет компилятору выполнять более строгую проверку типов, чем id
.
Иллюстрация этого использования в подклассах из фреймворка: +[NSString stringWithFormat:]
возвращает экземпляр NSString
, тогда как +[NSMutableString stringWithFormat:]
возвращает экземпляр подкласса NSMutableString
, без NSMutableString
требуется явно переопределить метод.
Как обсуждалось в документе [ Основы] [1], для этих методов factory используются другие методы, такие как доступ к одиночному тону или оценка необходимого распределения памяти перед его выполнением (< возможно, но менее удобно, со стандартной парой alloc
/init
).
1 "Статические методы" в Java или С++, "методы класса" в Objective-C. В ObjC нет статических методов
2 В то время как метод экземпляра self
является разумно ссылкой на экземпляр.
3 Ранее как обычные методы инициализации (initWith...
), вы бы в качестве возвращаемого типа использовался id
. Использование определенного имени класса принудительно заставляет подклассы переопределять метод.