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