Объявления IBOutlet?

Я видел код, написанный тремя разными способами (в отношении IBOutlet). Имеет ли значение, я бы сказал, что добавление IBOutlet как к объявлению, так и к @property было более кратким.

ПРОСТОЕ СОБСТВЕННОСТЬ:

@class SwitchViewController;

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    SwitchViewController *switchViewController;
}

@property(nonatomic, retain) IBOutlet UIWindow *window;
@property(nonatomic, retain) IBOutlet SwitchViewController *switchViewController;
@end

ТОЛЬКО ДЕКЛАРАЦИЯ:

@class SwitchViewController;

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> {
    IBOutlet UIWindow *window;
    IBOutlet SwitchViewController *switchViewController;
}

@property(nonatomic, retain) UIWindow *window;
@property(nonatomic, retain) SwitchViewController *switchViewController;
@end

ОБА:

@class SwitchViewController;

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> {
    IBOutlet UIWindow *window;
    IBOutlet SwitchViewController *switchViewController;
}

@property(nonatomic, retain) IBOutlet UIWindow *window;
@property(nonatomic, retain) IBOutlet SwitchViewController *switchViewController;
@end

cheers gary

Ответ 1

Не важно. С 10.6 64-разрядным SDK вы также можете записать свойство без ivar:

@class SwitchViewController;

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> {
}

@property(nonatomic, retain) IBOutlet UIWindow *window;
@property(nonatomic, retain) IBOutlet SwitchViewController *switchViewController;
@end

Ответ 2

IBOutlet имеет значение только для InterfaceBuilder. Для компилятора UINibDeclarations.h #define это ничего.

ИнтерфейсBuilder принимает IBOutlet как подсказку из файла заголовка, чтобы отобразить доступные выпуски для класса. Если вы привязываете объект к IBOutlet, независимо от того, определяется ли он как переменная свойства или экземпляра, эта информация записывается в nib.

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

Все ваши предлагаемые примеры имеют свойство (и, конечно же, метод setter) правильного имени. Таким образом, в каждом случае загрузчик будет использовать метод setter, независимо от того, где стоит тег IBOutlet: Нет никакой разницы между вашими примерами, ни в nib, ни в том, как выполняется код.

Лучший стиль - поместить тег IBOutlet в определение свойства.

Ответ 3

Текущий стиль в примере кода Apple помещает IBOutlet в объявление свойства. Для согласованности это, вероятно, лучшее место для его броска.

Ответ 4

Я также нашел этот способ (без объявления свойств):

@class SwitchViewController;

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> {
    IBOutlet UIWindow *window;
    IBOutlet SwitchViewController *switchViewController;
}

@end

Как насчет этого?