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

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];
4b9b3361

Ответ 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 предназначен для подклассов.