UIButton - выделить initWithFrame: vs. buttonWithType: - PullRequest
14 голосов
/ 06 июня 2011

Дано (произвольно):

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

Ответы [ 6 ]

16 голосов
/ 06 июня 2011

Я думаю, что они эквивалентны.Ха-ха!Трюк, вопрос, подлый маленький панк!

Рассуждение

  1. -buttonWithType: возвращает автоматически освобожденный UIButton объект.

  2. +[NSObject alloc] по умолчанию для переменных скалярного экземпляра равно 0, поэтому buttonType должно быть 0 или UIButtonTypeCustom.

Плюсы и минусы

  1. Можно утверждать, что яснее использовать -buttonWithType: и явно указывать buttonType и что безопаснее, если Apple изменит UIButtonTypeCustom на 1 вместо 0 (что, скорее всего, никогда не произойдет).

  2. С другой стороны, вы также можете утверждать, что он достаточно ясен и безопасен для использования -initWithFrame.Кроме того, многие примеры проектов Xcode, такие как «TheElements» и «BubbleLevel», используют этот подход.Одним из преимуществ является то, что вы можете явно освободить UIButton до того, как цикл выполнения для основного потока вашего приложения истощит пул авто-выпуска.И именно поэтому я предпочитаю вариант 2.

7 голосов
/ 06 июня 2011

Я бы настоятельно рекомендовал использовать первый подход (+buttonWithType), потому что это единственный способ указать тип кнопки.

Если вы +alloc и -initWithFrame:, buttonType установленок некоторому стандартному значению (не уверен, какое именно, и это может измениться в более поздних версиях SDK), и вы не сможете изменить тип впоследствии, потому что свойство buttonType доступно только для чтения.

2 голосов
/ 06 июня 2011

Основное (может быть, единственное) отличие заключается в управлении памятью: как вы сказали, buttonWithType возвращает автоматически выпущенный UIButton.Таким образом, вам не нужно беспокоиться о его выпуске.С другой стороны, вы не являетесь его владельцем, поэтому вы не можете освободить его, когда захотите (за исключением, конечно, если вы drain пул авто-релиза).
Вызывая явно [[UIButton alloc] initWithFrame:frame], вместо этого вы динамически распределяете свою кнопку, поэтому вы владеете ею и несете ответственность за ее отпускание.
Если вы по какой-то причине планируете сохранить свою кнопку, то, возможно, вам следует рассмотреть второе решение, но если, как и в этом случае, вы немедленно автоматически ее высвободите, нет большой разницы между двумя способами создания кнопки..

0 голосов
/ 28 мая 2014

Я просмотрел документацию UIButton, и вот что я нашел:

Обсуждение Этот метод является удобным конструктором для создания объектов кнопок с конкретными конфигурациями.Если вы создаете подкласс UIButton, этот метод не возвращает экземпляр вашего подкласса. Если вы хотите создать экземпляр определенного подкласса, вы должны непосредственно выделить / инициализировать кнопку .

Я полагаю, что это хитростьalloc-initWithFrame для подклассов.

0 голосов
/ 13 июня 2011

Вы можете использовать первое и сделать «[кнопка сохранения];», так что вы никогда не потеряете указатель.

0 голосов
/ 06 июня 2011

Два варианта одинаковы, но я предпочитаю вариант 2, потому что он может обрабатывать управление памятью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...