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

Объявление IBOutlet внутри или снаружи @interface?

извините Если я слишком придирчив к этому, но сейчас я изучаю программирование на iOS, и мне кажется, что некоторые люди объявляют IBOutlet следующим образом:

IBOutlet, привязанный к свойству

#import <UIKit/UIKit.h>
#import "CustomCell.h"

@interface CustomTableViewController : UITableViewController {
  CustomCell *customCell;
}
@property (nonatomic, retain) IBOutlet CustomCell *customCell;
@end

И некоторые объявления:

IBOutlet, прикрепленный к объявлению внутри интерфейса

#import <UIKit/UIKit.h>
#import "CustomCell.h"

@interface CustomTableViewController : UITableViewController {
  IBOutlet CustomCell *customCell;
}
@property (nonatomic, retain) CustomCell *customCell;
@end

какой из них является правильным способом объявить его? Существуют ли какие-либо различия между ними? Если кто-то знает, почему они кладут его в разные места, было бы здорово учиться.

Спасибо большое:)

4b9b3361

Ответ 1

Оба из них все еще "внутри интерфейса", поэтому ваш заголовок немного запутан, но я вижу, что вы просите.

Во многих случаях результат любого подхода будет таким же, но они разные. Свойство IBOutlet вызывает метод set setter, который дает вам возможность переопределить этот setter, если параметр имеет свойство, которое должно иметь некоторый побочный эффект.

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

Объекты в файле nib создаются с сохранением числа 1 и затем автоматически сохраняются. Поскольку он восстанавливает иерархию объектов, UIKit восстанавливает соединения между объектами, используя setValue: forKey:, который использует доступный метод setter или сохраняет объект по умолчанию, если не доступен метод setter. Это означает, что (при условии, что вы следуете шаблону, показанному в "Outlets" ), любой объект, для которого у вас есть выход, остается в силе. Однако если какие-либо объекты верхнего уровня, которые вы не храните в торговых точках, вы должны сохранить либо массив, возвращаемый методом loadNibNamed: owner: options: или объекты внутри массива, чтобы предотвратить преждевременное освобождение этих объектов.

IBOutlet ivars вызовет сеттеры для этих ivars, если они существуют, и непосредственно сохранит объект, загруженный из nib, если не найден сеттер.

Реклама свойства как IBOutlet по крайней мере дает понять, что средство настройки свойств всегда будет использоваться и следовать за тем, какое правило управления памятью было установлено для этого свойства.

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

Ответ 2

Два стиля взаимозаменяемы, нет никакой разницы в сгенерированном коде или способе загрузки объектов из наконечника. На самом деле.

Однако оба стиля имеют избыточную строку. Просто оставьте выражение ivar. Только строка

@property (nonatomic, retain) IBOutlet CustomCell *customCell;

является достаточным в современной среде выполнения.

Если у вас сложный проект, я предлагаю переместить все выходы из открытого интерфейса в отдельный файл заголовка. Большинство торговых точек являются частным интерфейсом, единственная причина для их включения в заголовок - так что интерфейс Builder может их найти.

Ответ 3

Вы можете объявить оба способа, на самом деле нет никакой разницы.

Но вот что:

Если вам нужен ваш класс, чтобы иметь некоторый ivar с особым поведением или он должен быть доступен извне и т.д., и он должен быть свойством, то я скажу, что у вас есть 2 варианта на выбор (прилагается к свойство и внутри интерфейса класса).

Если это не ваш случай, не создавайте свойство, не нужно, просто делайте это внутри интерфейса класса.

Надеюсь, что это поможет;)