UICololor класс фабричных методов - когда они выпущены

Я читаю о методах фабрики классов в target-c как шаблоне проектирования, и у меня возникла путаница. Я использую UIColor в качестве примера для вопроса о простоте, но если что-то меняется с другими методами фабрики классов, дайте мне знать. Основная концепция:

UIColor *white = [UIColor whiteColor]; 

Я понимаю, что это сочетает в себе распределение и инициализацию. Некоторая часть документации, которую я прочитал, старше автоматического подсчета ссылок и относится к ней с помощью автоматического выпуска (что-то, с чем я не знаком, не используя MRC). Я пытаюсь понять, как это связано с автоматическим подсчетом ссылок и синглетонами. Если я сделаю это, например:

UIColor *whiteSquare = [UIColor whiteColor]; 
UIColor *whiteBall = [UIColor whiteColor]; 

Сохраняю ли я только один объект вроде единственного?

Когда это выпущено? когда все объекты, которые состоят из whiteColor, выходят из области видимости или имеют значение nil?

Я ссылался на методы класса, которые создают новые экземпляры, но меня немного смутили некоторые ответы, относящиеся к ARC, а некоторые нет.

Окончательный ответ в вышеупомянутой теме говорит:

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

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

Не нужно делать авто-релиз с ARC. "

Мне просто непонятно, что означает этот автоматический релиз. Я прочитал некоторую документацию на яблоко, и они указали, что это было частью картины. В приведенном выше примере, если это правда, это создаст несколько экземпляров переменной, если это правда. Метод является методом класса, но приведенный выше код подразумевает его не статическое присваивание.

Это все, что означает метод фабрики классов? Он возвращает объект, как любая другая инициализация, но это статический метод или метод класса, и он объединяет распределение и инициализацию? Как на это влияет автоматический релиз? У меня проблемы с пониманием, почему он не может просто создать один белый цвет для всех объектов, чтобы поделиться. Это кажется более эффективным. Но что заставило меня задать этот вопрос, так это понять шаблон проектирования методов фабрики классов и, очевидно, то, как это делается, так или иначе.

В ARC и autorelease главный ответ гласит: "Авто-релиз как механизм все еще используется ARC, кроме того, скомпилированный код ARC предназначен для беспрепятственного взаимодействия со скомпилированным кодом MRC, так что механизм авто-выпуска существует". Так что я все еще застрял в удивлении, есть ли одна или две копии, если я попрошу дважды по белому цвету для двух объектов. И когда это выпущено. В приведенном выше примере кода он выглядит как объект, как и любой другой, но в приведенном выше сообщении он отличается.

второй ответ в вышеупомянутой теме говорит: "autorelease используется для возвращаемого функционального объекта, поэтому вызывающий объект не становится владельцем, и вызываемый объект освободит объект в будущем". Итак, опять же, что является мотивацией здесь? хочет ли класс UIColor иметь только один объект для всех вызываемых? Как этот фактор влияет на шаблон проектирования фабрики классов?

ссылка на класс для UIColor https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIColor_Class/index.html просто говорит для функции whiteColor: "Возвращаемое значение Объект UIColor".

и я не нахожу там ответа.

Выполняя немного больше исследований, я вижу: "Еще одна цель метода фабрики классов - обеспечить, чтобы определенный класс (например, NSWorkspace) продавал одноэлементный экземпляр". https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/ClassFactoryMethods/ClassFactoryMethods.html

Это результат дальнейших исследований. Я собираюсь перенести любые другие вопросы в другой пост.

1 ответ

Решение

Заводские методы, такие как [UIColor whiteColor] не обязательно выделять каждый раз. Они могут раздавать один и тот же экземпляр каждый раз (синглтон). Так что вполне возможно, что возвращаемый объект никогда не освобождается. Когда вы звоните [UIColor whiteColor] Несколько раз вы можете получать разные объекты каждый раз или вы можете получать один и тот же объект каждый раз, это не определено. Но это не то, что вам нужно или должно заботиться (обычно).

На самом деле, нет ничего особенного в "фабричных" методах управления памятью. Применяются те же правила, что и для всех методов. В этом случае вы должны предположить, что возвращаемый объект автоматически освобожден; Вы не "владеете" этим. Правила таковы:

Вы "владеете" объектом (вы должны освободить его при использовании не-ARC), если имя его метода начинается с:

  • новый
  • Alloc
  • копия

Так как эти фабричные методы начинаются с того, что вы не владеете ими, вы не выпускаете их самостоятельно (если только вы retain их сначала, конечно).

С ARC сохранение / освобождение / автоматическое освобождение - это то, о чем вы больше не думаете. Вы больше заботитесь о "слабых" и "сильных" ссылках. Поэтому, если вам нужно, чтобы эти объекты держались, вам нужно назначить их сильным свойствам или переменным экземпляра, иначе они могут быть освобождены механизмом автоматического освобождения.

Другие вопросы по тегам