Проблема с +alloc
заключается в том, что он сохраняет свой результат, поэтому он должен быть сбалансирован с вызовом -release
или -autorelease
позже.Чтобы избегать необходимости вводить это снова и снова при каждом использовании класса, разработчики API обычно создают так называемый вспомогательный конструктор или вспомогательный метод .+URLWithString:
является одним из них, и внутренне это выглядит так:
+ (id)URLWithString: (NSString *)str {
return [[[self alloc] initWithString: str] autorelease];
}
То есть +alloc
получает для вас, как и -autorelease
.
Справочная информация
В Objective-C существует два широких вида методов: методы класса и методы экземпляра.Методы класса отправляются самому классу и не требуют создания экземпляра этого класса.Методы экземпляра отправляются экземпляру и могут получить доступ к памяти, которую этот экземпляр занимает.Методы класса начинаются с +
;Методы экземпляра с -
.
+alloc
- это метод класса.Это не волшебство с особыми способностями создания объектов.Все, что он делает внутри, это что-то вроде:
+ (id)alloc {
id result = malloc(class_getInstanceSize(self));
if (result) {
memset(result, 0, class_getInstanceSize(self));
result->isa = self;
result->retainCount = 1;
}
return result;
}
(На самом деле это немного сложнее, но здесь этого должно быть достаточно.) Обратите внимание, что +alloc
определено как часть NSObject
, не часть всех объектов.Управление памятью какао с помощью +alloc
, -init
, -retain
, -release
и т. Д. Не всегда является частью Objective-C, и могут быть созданы объекты, которые не используют его.
На самом деле вы можете создавать экземпляры класса без вызова +alloc
, если вы знаете правильные заклинания.Я не рекомендовал бы это.