Подключение IBOutlets, переменная, свойство или оба? - PullRequest
4 голосов
/ 09 марта 2012

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

Если вы перетащите его внутрь блока переменной, вы получите что-то вроде этого:

@interface MyViewController : UIViewController {
    IBOutlet UIButton *foo;
}

перетаскивание его за пределы блока дает вам что-то вроде ...

@interface ViewController : UIViewController {
}
@property (retain, nonatomic) IBOutlet UIButton *foo;

Я думал о том, как они отличаются, и я немного запутался.Хорошо, я понимаю, что синтезированные свойства делают некоторую магию и создают переменные экземпляра во время выполнения (только на 64-битной / ARM).Поэтому я считаю, что понимаю, как работают 2 варианта.

Какой вариант лучше?Первый вариант генерирует меньше кода и выглядит проще.

Вторая версия предлагает публичные средства доступа / мутаторы, но я редко обращаюсь к выходам за пределами моего класса (и если я это делаю, это почти всегда с инкапсуляцией).С тех пор, как я начал работать с iOS, я использовал эту опцию исключительно.

Я что-то упустил или в большинстве случаев я должен переключиться на розетки с переменными значениями?

Ответы [ 3 ]

1 голос
/ 10 апреля 2012

Возможность объявить IBOutlet в объявлении свойства является относительно новой @property (retain, nonatomic) IBOutlet UIButton *foo;

Ранее вы должны были объявить IBOutlet UIButton *foo внутри фигурных скобок, а затем синтезировать свойство. Теперь объявление IBOutlet в фигурных скобках является излишним.

У вас есть два варианта объявления свойств сейчас. Вариант 1 - объявить его в вашем файле .h, что сделает его общедоступным. Кроме того, вы можете создать частный интерфейс в вашем файле .m, используя:

@interface MYCLASS()
@end

и объявите свои свойства там. Это мой предпочтительный способ сделать это, если мне не нужен публичный доступ к этому свойству (что должно быть исключением, а не нормой, если вы подчиняетесь соглашениям MVC).

1 голос
/ 16 апреля 2012

Краткий ответ: В любом случае это не имеет большого значения.

Длинный ответ: Если вам нужны методы set / mutator, перетащите их за пределы блока. Если вы не заботитесь о методах и просто собираетесь обращаться к переменным напрямую, то, вероятно, лучше всего использовать их как прямые переменные внутри блока.

Публичная видимость : Если вы просто указываете IBOutlet в качестве переменной, вы можете использовать @private или @protected для предотвращения доступа извне. Если вы действительно хотите по какой-то причине @property, вы все равно можете контролировать публичную видимость, переместив свойство из .h в расширение класса в файле .m.

Вывод: Сам я придерживаюсь прямого объявления переменных и сохраняю другие опции, когда мне нужно что-то дополнительное.

0 голосов
/ 09 марта 2012

IBOutlets лучше всего работать внутри блока, если вы действительно не планируете работать с ним в файле .m.

Помните, что вы можете иметь и то, и другое.Один элемент внутри блока переменных, по сути, по сути, только для того случая, когда вы используете его в IBActions.

Свойство можно использовать в файле .m для дальнейшей настройки.

Снова, вы можете использовать оба, это зависит только от того, насколько вы его используете.

...