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