我已经看到下面的代码以3种不同的方式编写(关于IBOutlet)是否重要,我想说将IBOutlet添加到声明和@property都更简洁。
JUST 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
JUST DECLARATION:
@class SwitchViewController;
@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> {
IBOutlet UIWindow *window;
IBOutlet SwitchViewController *switchViewController;
}
@property(nonatomic, retain) UIWindow *window;
@property(nonatomic, retain) SwitchViewController *switchViewController;
@end
BOTH:
@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 :(得分:11)
IBOutlet
只对InterfaceBuilder有用。对于编译器,UINibDeclarations.h #define
没什么。
InterfaceBuilder从头文件中提取IBOutlet
以列出该类的可用出口。如果将对象连接到IBOutlet
,无论是将其定义为属性还是实例变量,都会将此信息写入nib。
加载nib时,加载器会尝试找到建立连接的最佳方法:首先,它尝试查找具有适当名称的setter方法。如果没有找到这样的setter,它会直接回到直接设置实例变量,这样的风格很差,因为内存管理不是很清楚。
您提出的所有示例都有正确名称的属性(当然还有setter方法)。所以在每种情况下,加载器都会使用setter方法,无论IBOutlet
标记位于何处:您的示例之间没有区别,无论是在nib中,还是在代码执行方式上都没有。
最好的方式是将IBOutlet
标记放入属性定义中。
答案 1 :(得分:7)
无所谓。使用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 :(得分:3)
Apple示例代码中的当前样式将IBOutlet放在属性声明中。为了保持一致性,这可能是抛出它的最佳位置。
答案 3 :(得分:0)
我也发现了这种方式(没有任何属性声明):
@class SwitchViewController;
@interface iPhone_switcherAppDelegate : NSObject <UIApplicationDelegate> {
IBOutlet UIWindow *window;
IBOutlet SwitchViewController *switchViewController;
}
@end
这个怎么样?