UIButton - alloc initWithFrame: vs. buttonWithType:
Дано (произвольно):
CGRect frame = CGRectMake(0.0f, 0.0f, 100.0f, 30.0f);
В чем разница между следующими двумя фрагментами кода?
1.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = frame;
2.
UIButton *button = [[[UIButton alloc] initWithFrame:frame] autorelease];
Ответы
Ответ 1
Я думаю, что они эквивалентны. Ха-ха! Трюк спрашивает, что вы подлый маленький панк!
Рассуждение
-
-buttonWithType:
возвращает объект с автореализацией UIButton
.
-
+[NSObject alloc]
по умолчанию сканирует переменные экземпляра 0
, поэтому buttonType
должен быть 0
или UIButtonTypeCustom
.
Плюсы и минусы
-
Вы можете утверждать, что проще использовать -buttonWithType:
и установить buttonType
явно, и что это безопаснее, если Apple изменит UIButtonTypeCustom
на 1
вместо 0
(что, безусловно, никогда не будет бывает).
-
С другой стороны, вы также можете утверждать, что он достаточно понятен и безопасен для использования -initWithFrame
. Кроме того, многие из примеров Xcode, таких как "TheElements" и "BubbleLevel", используют этот подход. Одно из преимуществ заключается в том, что вы можете явно освободить UIButton
до того, как цикл цикла для вашего основного потока приложения исчерпал свой пул автозаполнения. И поэтому я предпочитаю вариант 2.
Ответ 2
Я бы настоятельно предложил использовать первый подход (+buttonWithType
), потому что это единственный способ указать тип кнопки.
Если вы +alloc
и -initWithFrame:
, для параметра buttonType
установлено какое-то стандартное значение (не знаете, что, и это может измениться в более поздних версиях SDK), и впоследствии вы не можете изменить тип, потому что buttonType
свойство только для чтения.
Ответ 3
Основная (возможно, единственная) разница заключается в управлении памятью: как вы сказали, buttonWithType
возвращает autoreleased UIButton
. Таким образом, вам не нужно беспокоиться о его выпуске. С другой стороны, вы не владеете им, поэтому вы не можете его отпускать, если хотите (за исключением, конечно, если вы drain
пул авторекламы).
Вызывая явно [[UIButton alloc] initWithFrame:frame]
, вместо этого вы динамически назначаете свою кнопку, чтобы вы ее владельцем, и вы несете ответственность за ее выпуск.
Если вы по какой-то причине хотите сохранить свою кнопку, то, возможно, вам стоит рассмотреть второе решение, но если, как и в этом случае, вы автоматически очищаете его, нет никакой большой разницы между двумя способами создания кнопки..
Ответ 4
Два варианта одинаковы, но я предпочитаю вариант 2, потому что он может обрабатывать управление памятью
Ответ 5
Вы можете использовать первый и сделать "[button сохранить];", поэтому вы никогда не потеряете указатель.
Ответ 6
Я просмотрел документацию UIButton
, и вот что я нашел:
Обсуждение Этот метод является конструктором удобства для создания объектов кнопок с определенными конфигурациями. Если вы подклассифицируете UIButton, этот метод не возвращает экземпляр вашего подкласса. Если вы хотите создать экземпляр определенного подкласса, вы должны напрямую указать/запустить кнопку.
Я думаю, это трюк. alloc-initWithFrame
предназначен для подклассов.