Подтвердить что ты не робот

Методы класса, которые создают новые экземпляры

Помимо стандартного шаблона [[MyClass alloc] init] некоторые объекты создаются из статических методов, таких как MyClass *obj = [MyClass classWithString:@"blabla"]

В соответствии с распространенными руководствами по управлению памятью (включая Apple) вы несете ответственность за освобождение объектов, которые вы alloc.

Может ли кто-нибудь предоставить мне шаблон для таких методов? Как вы можете вернуть выделенный объект ([self alloc]; return self;, возможно)? Как вы убедитесь, что он будет выпущен?

4b9b3361

Ответ 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. Использование определенного имени класса принудительно заставляет подклассы переопределять метод.

Ответ 2

Объекты, возвращаемые из методов factory, должны быть автореализованы, то есть они будут очищены, когда связанный пул авторесурсов будет удален. Это означает, что вы не являетесь владельцем возвращенных объектов, если вы не copy или retain их. Ниже приведен пример метода factory:

+ (id)myClassWithString:(NSString *)string {
    return [[[MyClass alloc] initWithString:string] autorelease];
}

Ответ 3

Эти методы просто возвращают автореализованную версию объекта.

+(MyClass*)class
{
  MyClass* object = [[MyClass alloc] init];
  return [object autorelease];
}

Ответ 4

Современный способ сделать это с ARC и последним компилятором:

+ (instancetype) myClassWithString:(NSString *)string {
     return [[MyClass alloc] initWithString:string];
}
  • Не нужно авторекламу с помощью ARC.
  • instancetype обеспечивает лучшие проверки времени компиляции, делая возможным создание подклассов.