2010-02-05 3 views
11

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

JUST НЕДВИЖИМОСТЬ:

@class SwitchViewController; 

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

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

JUST ДЕКЛАРАЦИЯ:

@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 

веселит Гэри

+0

@fuzzygoat: +1 Имел тот же вопрос в виду, и вот он был. –

ответ

7

не имеет значения. С 10.6 64-битного SDK можно также записать свойство без Иваров:

@class SwitchViewController; 

@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> { 
} 

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

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

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

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

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

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

3

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

0

Я также нашел этот путь (без какой-либо имущественной декларации):

@class SwitchViewController; 

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

@end 

Что об этом?

+0

Как сказал Николай далее, это приведет к тому, что загрузчик Nib будет напрямую устанавливать переменную экземпляра, не пройдя через метод setter, что означает, что ваш класс больше не управляет памятью этих переменных (ваш код никогда не «сохраняет» его). Создайте аксесуары свойств, чтобы убедиться, что экземпляры правильно сохранены и выпущены. –

+2

Является ли это последнее замечание еще актуальным с ARC? –

Смежные вопросы